@ohos-ports/514labs-kafka-javascript 0.0.0-stage → 1.7.1-patch-beta.0

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 (639) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.editorconfig +5 -0
  3. package/.envrc +1 -0
  4. package/CHANGELOG.md +380 -0
  5. package/CONTRIBUTING.md +257 -0
  6. package/INTRODUCTION.md +1155 -0
  7. package/LICENSE.kafkajs +31 -0
  8. package/LICENSE.node-rdkafka +25 -0
  9. package/LICENSE.txt +20 -0
  10. package/MIGRATION.md +428 -0
  11. package/Makefile +84 -0
  12. package/QUICKSTART.md +70 -0
  13. package/README.md +127 -2
  14. package/SECURITY.md +11 -0
  15. package/binding.gyp +167 -0
  16. package/buf.gen.yaml +8 -0
  17. package/build/Release/confluent-kafka-javascript.node +0 -0
  18. package/configure +15 -0
  19. package/coverage/mocha/base.css +224 -0
  20. package/coverage/mocha/block-navigation.js +87 -0
  21. package/coverage/mocha/coverage-final.json +11 -0
  22. package/coverage/mocha/favicon.png +0 -0
  23. package/coverage/mocha/forked-kafkajs/index.html +116 -0
  24. package/coverage/mocha/forked-kafkajs/lib/client.js.html +2122 -0
  25. package/coverage/mocha/forked-kafkajs/lib/error.js.html +1588 -0
  26. package/coverage/mocha/forked-kafkajs/lib/index.html +236 -0
  27. package/coverage/mocha/forked-kafkajs/lib/kafka-consumer-stream.js.html +1282 -0
  28. package/coverage/mocha/forked-kafkajs/lib/kafka-consumer.js.html +2476 -0
  29. package/coverage/mocha/forked-kafkajs/lib/producer-stream.js.html +1096 -0
  30. package/coverage/mocha/forked-kafkajs/lib/producer.js.html +1300 -0
  31. package/coverage/mocha/forked-kafkajs/lib/topic-partition.js.html +358 -0
  32. package/coverage/mocha/forked-kafkajs/lib/topic.js.html +214 -0
  33. package/coverage/mocha/forked-kafkajs/lib/util.js.html +250 -0
  34. package/coverage/mocha/forked-kafkajs/librdkafka.js.html +121 -0
  35. package/coverage/mocha/index.html +131 -0
  36. package/coverage/mocha/prettify.css +1 -0
  37. package/coverage/mocha/prettify.js +2 -0
  38. package/coverage/mocha/sort-arrow-sprite.png +0 -0
  39. package/coverage/mocha/sorter.js +210 -0
  40. package/cpplint.py +6970 -0
  41. package/deploy.enc +0 -0
  42. package/deps/librdkafka/.clang-format +136 -0
  43. package/deps/librdkafka/.clang-format-cpp +103 -0
  44. package/deps/librdkafka/.dir-locals.el +10 -0
  45. package/deps/librdkafka/.formatignore +33 -0
  46. package/deps/librdkafka/.gdbmacros +19 -0
  47. package/deps/librdkafka/CHANGELOG.md +2225 -0
  48. package/deps/librdkafka/CMakeLists.txt +291 -0
  49. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  50. package/deps/librdkafka/CONFIGURATION.md +209 -0
  51. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  52. package/deps/librdkafka/Doxyfile +2375 -0
  53. package/deps/librdkafka/INTRODUCTION.md +2481 -0
  54. package/deps/librdkafka/LICENSE +26 -0
  55. package/deps/librdkafka/LICENSE.cjson +22 -0
  56. package/deps/librdkafka/LICENSE.crc32c +28 -0
  57. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  58. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  59. package/deps/librdkafka/LICENSE.lz4 +26 -0
  60. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  61. package/deps/librdkafka/LICENSE.nanopb +22 -0
  62. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  63. package/deps/librdkafka/LICENSE.pycrc +23 -0
  64. package/deps/librdkafka/LICENSE.queue +31 -0
  65. package/deps/librdkafka/LICENSE.regexp +5 -0
  66. package/deps/librdkafka/LICENSE.snappy +36 -0
  67. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  68. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  69. package/deps/librdkafka/LICENSES.txt +625 -0
  70. package/deps/librdkafka/Makefile +125 -0
  71. package/deps/librdkafka/README.md +199 -0
  72. package/deps/librdkafka/README.win32 +26 -0
  73. package/deps/librdkafka/STATISTICS.md +624 -0
  74. package/deps/librdkafka/configure +214 -0
  75. package/deps/librdkafka/configure.self +331 -0
  76. package/deps/librdkafka/dev-conf.sh +123 -0
  77. package/deps/librdkafka/lds-gen.py +73 -0
  78. package/deps/librdkafka/mainpage.doxy +40 -0
  79. package/deps/librdkafka/mklove/Makefile.base +329 -0
  80. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  81. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  82. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  83. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  84. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  85. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  86. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  87. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  88. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  89. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  90. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  91. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  92. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  93. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  94. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  95. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  96. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  97. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  98. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  99. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  100. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  101. package/deps/librdkafka/service.yml +172 -0
  102. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  103. package/deps/librdkafka/src/Makefile +103 -0
  104. package/deps/librdkafka/src/README.lz4.md +30 -0
  105. package/deps/librdkafka/src/cJSON.c +2834 -0
  106. package/deps/librdkafka/src/cJSON.h +398 -0
  107. package/deps/librdkafka/src/crc32c.c +430 -0
  108. package/deps/librdkafka/src/crc32c.h +38 -0
  109. package/deps/librdkafka/src/generate_proto.sh +66 -0
  110. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  111. package/deps/librdkafka/src/lz4.c +2727 -0
  112. package/deps/librdkafka/src/lz4.h +842 -0
  113. package/deps/librdkafka/src/lz4frame.c +2078 -0
  114. package/deps/librdkafka/src/lz4frame.h +692 -0
  115. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  116. package/deps/librdkafka/src/lz4hc.c +1631 -0
  117. package/deps/librdkafka/src/lz4hc.h +413 -0
  118. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  119. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  120. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  121. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  122. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  123. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  124. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  125. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  126. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  127. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  128. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  129. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  130. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  131. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  132. package/deps/librdkafka/src/queue.h +850 -0
  133. package/deps/librdkafka/src/rd.h +584 -0
  134. package/deps/librdkafka/src/rdaddr.c +255 -0
  135. package/deps/librdkafka/src/rdaddr.h +202 -0
  136. package/deps/librdkafka/src/rdatomic.h +230 -0
  137. package/deps/librdkafka/src/rdavg.h +260 -0
  138. package/deps/librdkafka/src/rdavl.c +210 -0
  139. package/deps/librdkafka/src/rdavl.h +250 -0
  140. package/deps/librdkafka/src/rdbase64.c +200 -0
  141. package/deps/librdkafka/src/rdbase64.h +43 -0
  142. package/deps/librdkafka/src/rdbuf.c +1884 -0
  143. package/deps/librdkafka/src/rdbuf.h +375 -0
  144. package/deps/librdkafka/src/rdcrc32.c +114 -0
  145. package/deps/librdkafka/src/rdcrc32.h +170 -0
  146. package/deps/librdkafka/src/rddl.c +179 -0
  147. package/deps/librdkafka/src/rddl.h +43 -0
  148. package/deps/librdkafka/src/rdendian.h +175 -0
  149. package/deps/librdkafka/src/rdfloat.h +67 -0
  150. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  151. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  152. package/deps/librdkafka/src/rdgz.c +120 -0
  153. package/deps/librdkafka/src/rdgz.h +46 -0
  154. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  155. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  156. package/deps/librdkafka/src/rdhttp.c +830 -0
  157. package/deps/librdkafka/src/rdhttp.h +101 -0
  158. package/deps/librdkafka/src/rdinterval.h +177 -0
  159. package/deps/librdkafka/src/rdkafka.c +5505 -0
  160. package/deps/librdkafka/src/rdkafka.h +10686 -0
  161. package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
  162. package/deps/librdkafka/src/rdkafka_admin.h +661 -0
  163. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  164. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  165. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  166. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  167. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  168. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  169. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  170. package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
  171. package/deps/librdkafka/src/rdkafka_broker.h +744 -0
  172. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  173. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  174. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  175. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  176. package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
  177. package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
  178. package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
  179. package/deps/librdkafka/src/rdkafka_conf.h +732 -0
  180. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  181. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  182. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  183. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  184. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  185. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  186. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  187. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  188. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  189. package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
  190. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  191. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  192. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  193. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  194. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  195. package/deps/librdkafka/src/rdkafka_int.h +1260 -0
  196. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  197. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  198. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  199. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  200. package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
  201. package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
  202. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  203. package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
  204. package/deps/librdkafka/src/rdkafka_mock.h +610 -0
  205. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
  206. package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
  207. package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
  208. package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
  209. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  210. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  211. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  212. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  213. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  214. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  215. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  216. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  217. package/deps/librdkafka/src/rdkafka_op.h +858 -0
  218. package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
  219. package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
  220. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  221. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  222. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  223. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  224. package/deps/librdkafka/src/rdkafka_proto.h +736 -0
  225. package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
  226. package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
  227. package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
  228. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  229. package/deps/librdkafka/src/rdkafka_request.c +7089 -0
  230. package/deps/librdkafka/src/rdkafka_request.h +732 -0
  231. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  232. package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
  233. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  234. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  235. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  236. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  237. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  238. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
  239. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
  240. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  241. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  242. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  243. package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
  244. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  245. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  246. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  247. package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
  248. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  249. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  250. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  251. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
  252. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  253. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  254. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  255. package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
  256. package/deps/librdkafka/src/rdkafka_topic.h +334 -0
  257. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  258. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  259. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  260. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  261. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  262. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  263. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  264. package/deps/librdkafka/src/rdlist.c +576 -0
  265. package/deps/librdkafka/src/rdlist.h +434 -0
  266. package/deps/librdkafka/src/rdlog.c +89 -0
  267. package/deps/librdkafka/src/rdlog.h +41 -0
  268. package/deps/librdkafka/src/rdmap.c +508 -0
  269. package/deps/librdkafka/src/rdmap.h +492 -0
  270. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  271. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  272. package/deps/librdkafka/src/rdports.c +61 -0
  273. package/deps/librdkafka/src/rdports.h +38 -0
  274. package/deps/librdkafka/src/rdposix.h +250 -0
  275. package/deps/librdkafka/src/rdrand.c +80 -0
  276. package/deps/librdkafka/src/rdrand.h +43 -0
  277. package/deps/librdkafka/src/rdregex.c +156 -0
  278. package/deps/librdkafka/src/rdregex.h +43 -0
  279. package/deps/librdkafka/src/rdsignal.h +57 -0
  280. package/deps/librdkafka/src/rdstring.c +645 -0
  281. package/deps/librdkafka/src/rdstring.h +98 -0
  282. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  283. package/deps/librdkafka/src/rdtime.h +356 -0
  284. package/deps/librdkafka/src/rdtypes.h +86 -0
  285. package/deps/librdkafka/src/rdunittest.c +549 -0
  286. package/deps/librdkafka/src/rdunittest.h +232 -0
  287. package/deps/librdkafka/src/rdvarint.c +134 -0
  288. package/deps/librdkafka/src/rdvarint.h +165 -0
  289. package/deps/librdkafka/src/rdwin32.h +382 -0
  290. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  291. package/deps/librdkafka/src/rdxxhash.h +328 -0
  292. package/deps/librdkafka/src/regexp.c +1352 -0
  293. package/deps/librdkafka/src/regexp.h +41 -0
  294. package/deps/librdkafka/src/snappy.c +1866 -0
  295. package/deps/librdkafka/src/snappy.h +62 -0
  296. package/deps/librdkafka/src/snappy_compat.h +138 -0
  297. package/deps/librdkafka/src/statistics_schema.json +444 -0
  298. package/deps/librdkafka/src/tinycthread.c +932 -0
  299. package/deps/librdkafka/src/tinycthread.h +503 -0
  300. package/deps/librdkafka/src/tinycthread_extra.c +199 -0
  301. package/deps/librdkafka/src/tinycthread_extra.h +212 -0
  302. package/deps/librdkafka/src/win32_config.h +58 -0
  303. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  304. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  305. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  306. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  307. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  308. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  309. package/deps/librdkafka/src-cpp/Makefile +55 -0
  310. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  311. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  312. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  313. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  314. package/deps/librdkafka/src-cpp/README.md +16 -0
  315. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  316. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  317. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  318. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  319. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  320. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  321. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  322. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  323. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  324. package/deps/librdkafka/tests/0004-conf.c +934 -0
  325. package/deps/librdkafka/tests/0005-order.c +133 -0
  326. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  327. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  328. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  329. package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
  330. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  331. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  332. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  333. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  334. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  335. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  336. package/deps/librdkafka/tests/0017-compression.c +140 -0
  337. package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
  338. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  339. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  340. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  341. package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
  342. package/deps/librdkafka/tests/0025-timers.c +147 -0
  343. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  344. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  345. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  346. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  347. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  348. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  349. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  350. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  351. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  352. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  353. package/deps/librdkafka/tests/0038-performance.c +121 -0
  354. package/deps/librdkafka/tests/0039-event.c +284 -0
  355. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  356. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  357. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  358. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  359. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  360. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  361. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  362. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  363. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  364. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  365. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  366. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  367. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  368. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  369. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  370. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  371. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  372. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  373. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  374. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  375. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  376. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  377. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  378. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  379. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  380. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  381. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  382. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  383. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  384. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  385. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  386. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  387. package/deps/librdkafka/tests/0073-headers.c +381 -0
  388. package/deps/librdkafka/tests/0074-producev.c +87 -0
  389. package/deps/librdkafka/tests/0075-retry.c +290 -0
  390. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  391. package/deps/librdkafka/tests/0077-compaction.c +363 -0
  392. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  393. package/deps/librdkafka/tests/0079-fork.c +93 -0
  394. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  395. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  396. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  397. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  398. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  399. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  400. package/deps/librdkafka/tests/0086-purge.c +368 -0
  401. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  402. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  403. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  404. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  405. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  406. package/deps/librdkafka/tests/0093-holb.c +200 -0
  407. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  408. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  409. package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
  410. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  411. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  412. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  413. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  414. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  415. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  416. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  417. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  418. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  419. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  420. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  421. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  422. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  423. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  424. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  425. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  426. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  427. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  428. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  429. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  430. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  431. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  432. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  433. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  434. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  435. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  436. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  437. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
  438. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  439. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  440. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  441. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  442. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  443. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  444. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  445. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  446. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  447. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  448. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
  449. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  450. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  451. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  452. package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
  453. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  454. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  455. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  456. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  457. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  458. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  459. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  460. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  461. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  462. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  463. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  464. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  465. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  466. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  467. package/deps/librdkafka/tests/CMakeLists.txt +170 -0
  468. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  469. package/deps/librdkafka/tests/Makefile +182 -0
  470. package/deps/librdkafka/tests/README.md +509 -0
  471. package/deps/librdkafka/tests/autotest.sh +33 -0
  472. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  473. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  474. package/deps/librdkafka/tests/buildbox.sh +17 -0
  475. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  476. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  477. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  478. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  479. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  480. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  481. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  482. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  483. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  484. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  485. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  486. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  487. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  488. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  489. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  490. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  491. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  492. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  493. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  494. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  495. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  496. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  497. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  498. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  499. package/deps/librdkafka/tests/java/Makefile +13 -0
  500. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  501. package/deps/librdkafka/tests/java/README.md +14 -0
  502. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  503. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  504. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  505. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  506. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  507. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  508. package/deps/librdkafka/tests/performance_plot.py +115 -0
  509. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  510. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  511. package/deps/librdkafka/tests/requirements.txt +2 -0
  512. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  513. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  514. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  515. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  516. package/deps/librdkafka/tests/run-test.sh +140 -0
  517. package/deps/librdkafka/tests/rusage.c +249 -0
  518. package/deps/librdkafka/tests/sasl_test.py +289 -0
  519. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  520. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  521. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  522. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  523. package/deps/librdkafka/tests/sockem.c +801 -0
  524. package/deps/librdkafka/tests/sockem.h +85 -0
  525. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  526. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  527. package/deps/librdkafka/tests/test.c +7778 -0
  528. package/deps/librdkafka/tests/test.conf.example +27 -0
  529. package/deps/librdkafka/tests/test.h +1028 -0
  530. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  531. package/deps/librdkafka/tests/testcpp.h +388 -0
  532. package/deps/librdkafka/tests/testshared.h +416 -0
  533. package/deps/librdkafka/tests/tools/README.md +4 -0
  534. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  535. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  536. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  537. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  538. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  539. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  540. package/deps/librdkafka/tests/until-fail.sh +87 -0
  541. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  542. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  543. package/deps/librdkafka/vcpkg.json +23 -0
  544. package/deps/librdkafka/win32/README.md +5 -0
  545. package/deps/librdkafka/win32/build-package.bat +3 -0
  546. package/deps/librdkafka/win32/build.bat +19 -0
  547. package/deps/librdkafka/win32/common.vcxproj +84 -0
  548. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  549. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  550. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  551. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  552. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  553. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  554. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  555. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  556. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  557. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  558. package/deps/librdkafka/win32/push-package.bat +4 -0
  559. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  560. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  561. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  562. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  563. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  564. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  565. package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
  566. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  567. package/deps/librdkafka/win32/wingetopt.c +564 -0
  568. package/deps/librdkafka/win32/wingetopt.h +101 -0
  569. package/deps/librdkafka/win32/wintime.h +33 -0
  570. package/deps/librdkafka.gyp +83 -0
  571. package/deps/windows-install.py +80 -0
  572. package/eslint.config.js +75 -0
  573. package/flake.lock +61 -0
  574. package/flake.nix +76 -0
  575. package/index.d.ts +3 -0
  576. package/jest.config.js +8 -0
  577. package/jsdoc.conf +23 -0
  578. package/lib/admin.js +732 -0
  579. package/lib/client.js +679 -0
  580. package/lib/error.js +501 -0
  581. package/lib/index.js +8 -0
  582. package/lib/kafka-consumer-stream.js +399 -0
  583. package/lib/kafka-consumer.js +798 -0
  584. package/lib/kafkajs/_admin.js +1053 -0
  585. package/lib/kafkajs/_common.js +887 -0
  586. package/lib/kafkajs/_consumer.js +2143 -0
  587. package/lib/kafkajs/_consumer_cache.js +310 -0
  588. package/lib/kafkajs/_error.js +298 -0
  589. package/lib/kafkajs/_kafka.js +125 -0
  590. package/lib/kafkajs/_linked-list.js +220 -0
  591. package/lib/kafkajs/_producer.js +863 -0
  592. package/lib/kafkajs/index.js +5 -0
  593. package/lib/producer/high-level-producer.js +400 -0
  594. package/lib/producer-stream.js +337 -0
  595. package/lib/producer.js +405 -0
  596. package/lib/rdkafka.js +44 -0
  597. package/lib/tools/ref-counter.js +53 -0
  598. package/lib/topic-partition.js +91 -0
  599. package/lib/topic.js +43 -0
  600. package/lib/util.js +55 -0
  601. package/librdkafka.js +12 -0
  602. package/make_docs.sh +57 -0
  603. package/package.json +59 -4
  604. package/run_docker.sh +42 -0
  605. package/service.yml +36 -0
  606. package/sonar-project.properties +9 -0
  607. package/src/admin.cc +1597 -0
  608. package/src/admin.h +112 -0
  609. package/src/binding.cc +76 -0
  610. package/src/binding.h +25 -0
  611. package/src/callbacks.cc +676 -0
  612. package/src/callbacks.h +302 -0
  613. package/src/common.cc +1601 -0
  614. package/src/common.h +192 -0
  615. package/src/config.cc +219 -0
  616. package/src/config.h +61 -0
  617. package/src/connection.cc +703 -0
  618. package/src/connection.h +117 -0
  619. package/src/errors.cc +119 -0
  620. package/src/errors.h +60 -0
  621. package/src/kafka-consumer.cc +1539 -0
  622. package/src/kafka-consumer.h +147 -0
  623. package/src/producer.cc +917 -0
  624. package/src/producer.h +124 -0
  625. package/src/topic.cc +173 -0
  626. package/src/topic.h +54 -0
  627. package/src/workers.cc +1714 -0
  628. package/src/workers.h +690 -0
  629. package/tsconfig.json +18 -0
  630. package/types/config.d.ts +1248 -0
  631. package/types/errors.d.ts +373 -0
  632. package/types/kafkajs.d.ts +568 -0
  633. package/types/rdkafka.d.ts +561 -0
  634. package/util/configure.js +34 -0
  635. package/util/generate-docs.sh +18 -0
  636. package/util/get-env.js +6 -0
  637. package/util/test-compile.js +11 -0
  638. package/util/test-producer-delivery.js +100 -0
  639. package/win_install.ps1 +2 -0
package/src/common.cc ADDED
@@ -0,0 +1,1601 @@
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
+ Nan::Set(obj, Nan::New("id").ToLocalChecked(),
266
+ Nan::New<v8::Number>(rd_kafka_Node_id(node)));
267
+ Nan::Set(obj, Nan::New("host").ToLocalChecked(),
268
+ Nan::New<v8::String>(rd_kafka_Node_host(node)).ToLocalChecked());
269
+ Nan::Set(obj, Nan::New("port").ToLocalChecked(),
270
+ Nan::New<v8::Number>(rd_kafka_Node_port(node)));
271
+
272
+ const char* rack = rd_kafka_Node_rack(node);
273
+ if (rack) {
274
+ Nan::Set(obj, Nan::New("rack").ToLocalChecked(),
275
+ Nan::New<v8::String>(rack).ToLocalChecked());
276
+ }
277
+
278
+ return obj;
279
+ }
280
+
281
+ /**
282
+ * @brief Converts a rd_kafka_Uuid_t* into a v8 object.
283
+ */
284
+ v8::Local<v8::Object> UuidToV8Object(const rd_kafka_Uuid_t* uuid) {
285
+ /*Return object type
286
+ {
287
+ mostSignificantBits: bigint
288
+ leastSignificantBits: bigint
289
+ base64: string
290
+ }
291
+ */
292
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
293
+
294
+ Nan::Set(obj, Nan::New("mostSignificantBits").ToLocalChecked(),
295
+ v8::BigInt::New(v8::Isolate::GetCurrent(),
296
+ rd_kafka_Uuid_most_significant_bits(uuid)));
297
+ Nan::Set(obj, Nan::New("leastSignificantBits").ToLocalChecked(),
298
+ v8::BigInt::New(v8::Isolate::GetCurrent(),
299
+ rd_kafka_Uuid_least_significant_bits(uuid)));
300
+ Nan::Set(
301
+ obj, Nan::New("base64").ToLocalChecked(),
302
+ Nan::New<v8::String>(rd_kafka_Uuid_base64str(uuid)).ToLocalChecked());
303
+
304
+ return obj;
305
+ }
306
+
307
+ /**
308
+ * @brief Converts a list of rd_kafka_AclOperation_t into a v8 array.
309
+ */
310
+ v8::Local<v8::Array> ToV8Array(
311
+ const rd_kafka_AclOperation_t* authorized_operations,
312
+ size_t authorized_operations_cnt) {
313
+ v8::Local<v8::Array> array = Nan::New<v8::Array>();
314
+
315
+ for (size_t i = 0; i < authorized_operations_cnt; i++) {
316
+ Nan::Set(array, i, Nan::New<v8::Number>(authorized_operations[i]));
317
+ }
318
+
319
+ return array;
320
+ }
321
+
322
+ } // namespace Util
323
+
324
+ namespace TopicPartition {
325
+
326
+ /**
327
+ * @brief RdKafka::TopicPartition vector to a v8 Array
328
+ *
329
+ * @see v8ArrayToTopicPartitionVector
330
+ * @note This method returns a v8 array of a mix of topic partition
331
+ * objects and errors. For a more uniform return type of
332
+ * topic partitions (which have an internal error property),
333
+ * use `ToTopicPartitionV8Array(const rd_kafka_topic_partition_list_t*,
334
+ * bool)`.
335
+ */
336
+ v8::Local<v8::Array> ToV8Array(
337
+ std::vector<RdKafka::TopicPartition*> & topic_partition_list) { // NOLINT
338
+ v8::Local<v8::Array> array = Nan::New<v8::Array>();
339
+ for (size_t topic_partition_i = 0;
340
+ topic_partition_i < topic_partition_list.size(); topic_partition_i++) {
341
+ RdKafka::TopicPartition* topic_partition =
342
+ topic_partition_list[topic_partition_i];
343
+
344
+ // TODO: why do we set the entire array element to be an error rather adding
345
+ // an error field to TopicPartition? Or create a TopicPartitionError?
346
+ if (topic_partition->err() != RdKafka::ErrorCode::ERR_NO_ERROR) {
347
+ Nan::Set(array, topic_partition_i,
348
+ Nan::Error(Nan::New(RdKafka::err2str(topic_partition->err()))
349
+ .ToLocalChecked()));
350
+ } else {
351
+ // We have the list now let's get the properties from it
352
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
353
+
354
+ if (topic_partition->offset() != RdKafka::Topic::OFFSET_INVALID) {
355
+ Nan::Set(obj, Nan::New("offset").ToLocalChecked(),
356
+ Nan::New<v8::Number>(topic_partition->offset()));
357
+ }
358
+
359
+ // If present, size >= 1, since it will include at least the
360
+ // null terminator.
361
+ if (topic_partition->get_metadata().size() > 0) {
362
+ Nan::Set(obj, Nan::New("metadata").ToLocalChecked(),
363
+ Nan::New<v8::String>(
364
+ reinterpret_cast<const char*>(topic_partition->get_metadata().data()), // NOLINT
365
+ // null terminator is not required by the constructor.
366
+ topic_partition->get_metadata().size() - 1)
367
+ .ToLocalChecked());
368
+ }
369
+
370
+ Nan::Set(obj, Nan::New("partition").ToLocalChecked(),
371
+ Nan::New<v8::Number>(topic_partition->partition()));
372
+ Nan::Set(obj, Nan::New("topic").ToLocalChecked(),
373
+ Nan::New<v8::String>(topic_partition->topic().c_str())
374
+ .ToLocalChecked());
375
+
376
+ int leader_epoch = topic_partition->get_leader_epoch();
377
+ if (leader_epoch >= 0) {
378
+ Nan::Set(obj, Nan::New("leaderEpoch").ToLocalChecked(),
379
+ Nan::New<v8::Number>(leader_epoch));
380
+ }
381
+
382
+ Nan::Set(array, topic_partition_i, obj);
383
+ }
384
+ }
385
+
386
+ return array;
387
+ }
388
+
389
+ /**
390
+ * @brief Converts a rd_kafka_topic_partition_list_t* into a list of v8 objects.
391
+ *
392
+ * @param topic_partition_list The list of topic partitions to convert.
393
+ * @param include_offset Whether to include the offset in the output.
394
+ * @returns [{topic: string, partition: number, offset?: number, error?:
395
+ * LibrdKafkaError}]
396
+ *
397
+ * @note Contains error within the topic partitions object, and not as separate
398
+ * array elements, unlike the `ToV8Array(std::vector<RdKafka::TopicPartition*> &
399
+ * topic_partition_list)`.
400
+ */
401
+ v8::Local<v8::Array> ToTopicPartitionV8Array(
402
+ const rd_kafka_topic_partition_list_t* topic_partition_list,
403
+ bool include_offset) {
404
+ v8::Local<v8::Array> array = Nan::New<v8::Array>();
405
+
406
+ for (int topic_partition_i = 0; topic_partition_i < topic_partition_list->cnt;
407
+ topic_partition_i++) {
408
+ rd_kafka_topic_partition_t topic_partition =
409
+ topic_partition_list->elems[topic_partition_i];
410
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
411
+
412
+ Nan::Set(obj, Nan::New("partition").ToLocalChecked(),
413
+ Nan::New<v8::Number>(topic_partition.partition));
414
+ Nan::Set(obj, Nan::New("topic").ToLocalChecked(),
415
+ Nan::New<v8::String>(topic_partition.topic).ToLocalChecked());
416
+
417
+ if (topic_partition.err != RD_KAFKA_RESP_ERR_NO_ERROR) {
418
+ v8::Local<v8::Object> error = NodeKafka::RdKafkaError(
419
+ static_cast<RdKafka::ErrorCode>(topic_partition.err));
420
+ Nan::Set(obj, Nan::New("error").ToLocalChecked(), error);
421
+ }
422
+
423
+ if (include_offset) {
424
+ Nan::Set(obj, Nan::New("offset").ToLocalChecked(),
425
+ Nan::New<v8::Number>(topic_partition.offset));
426
+ }
427
+
428
+ int leader_epoch =
429
+ rd_kafka_topic_partition_get_leader_epoch(&topic_partition);
430
+ if (leader_epoch >= 0) {
431
+ Nan::Set(obj, Nan::New("leaderEpoch").ToLocalChecked(),
432
+ Nan::New<v8::Number>(leader_epoch));
433
+ }
434
+
435
+ Nan::Set(array, topic_partition_i, obj);
436
+ }
437
+ return array;
438
+ }
439
+
440
+ /**
441
+ * @brief v8 Array of topic partitions to RdKafka::TopicPartition vector
442
+ *
443
+ * @see v8ArrayToTopicPartitionVector
444
+ *
445
+ * @note You must delete all the pointers inside here when you are done!!
446
+ */
447
+ std::vector<RdKafka::TopicPartition*> FromV8Array(
448
+ const v8::Local<v8::Array> & topic_partition_list) {
449
+ // NOTE: ARRAY OF POINTERS! DELETE THEM WHEN YOU ARE FINISHED
450
+ std::vector<RdKafka::TopicPartition*> array;
451
+
452
+ for (size_t topic_partition_i = 0;
453
+ topic_partition_i < topic_partition_list->Length(); topic_partition_i++) {
454
+ v8::Local<v8::Value> topic_partition_value;
455
+ if (!Nan::Get(topic_partition_list, topic_partition_i)
456
+ .ToLocal(&topic_partition_value)) {
457
+ continue;
458
+ }
459
+
460
+ if (topic_partition_value->IsObject()) {
461
+ array.push_back(FromV8Object(
462
+ Nan::To<v8::Object>(topic_partition_value).ToLocalChecked()));
463
+ }
464
+ }
465
+
466
+ return array;
467
+ }
468
+
469
+ /**
470
+ * @brief v8 Array of Topic Partitions to rd_kafka_topic_partition_list_t
471
+ *
472
+ * @note Converts a v8 array of type [{topic: string, partition: number,
473
+ * offset?: number}] to a rd_kafka_topic_partition_list_t
474
+ */
475
+ rd_kafka_topic_partition_list_t* TopicPartitionv8ArrayToTopicPartitionList(
476
+ v8::Local<v8::Array> parameter, bool include_offset) {
477
+ rd_kafka_topic_partition_list_t* newList =
478
+ rd_kafka_topic_partition_list_new(parameter->Length());
479
+
480
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
481
+ v8::Local<v8::Value> v;
482
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
483
+ continue;
484
+ }
485
+
486
+ if (!v->IsObject()) {
487
+ return NULL; // Return NULL to indicate an error
488
+ }
489
+
490
+ v8::Local<v8::Object> item = v.As<v8::Object>();
491
+
492
+ std::string topic = GetParameter<std::string>(item, "topic", "");
493
+ int partition = GetParameter<int>(item, "partition", -1);
494
+
495
+ rd_kafka_topic_partition_t* toppar =
496
+ rd_kafka_topic_partition_list_add(newList, topic.c_str(), partition);
497
+
498
+ if (include_offset) {
499
+ int64_t offset = GetParameter<int64_t>(item, "offset", 0);
500
+ toppar->offset = offset;
501
+ }
502
+ }
503
+ return newList;
504
+ }
505
+
506
+ /**
507
+ * @brief v8 Array of Topic Partitions with offsetspec to
508
+ * rd_kafka_topic_partition_list_t
509
+ *
510
+ * @note Converts a v8 array of type [{topic: string, partition: number,
511
+ * offset: {timestamp: number}}] to a rd_kafka_topic_partition_list_t
512
+ */
513
+ rd_kafka_topic_partition_list_t*
514
+ TopicPartitionOffsetSpecv8ArrayToTopicPartitionList(
515
+ v8::Local<v8::Array> parameter) {
516
+ rd_kafka_topic_partition_list_t* newList =
517
+ rd_kafka_topic_partition_list_new(parameter->Length());
518
+
519
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
520
+ v8::Local<v8::Value> v;
521
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
522
+ continue;
523
+ }
524
+
525
+ if (!v->IsObject()) {
526
+ return NULL; // Return NULL to indicate an error
527
+ }
528
+
529
+ v8::Local<v8::Object> item = v.As<v8::Object>();
530
+
531
+ std::string topic = GetParameter<std::string>(item, "topic", "");
532
+ int partition = GetParameter<int>(item, "partition", -1);
533
+
534
+ rd_kafka_topic_partition_t* toppar =
535
+ rd_kafka_topic_partition_list_add(newList, topic.c_str(), partition);
536
+
537
+ v8::Local<v8::Value> offsetValue =
538
+ Nan::Get(item, Nan::New("offset").ToLocalChecked()).ToLocalChecked();
539
+ v8::Local<v8::Object> offsetObject = offsetValue.As<v8::Object>();
540
+ int64_t offset = GetParameter<int64_t>(offsetObject, "timestamp", 0);
541
+
542
+ toppar->offset = offset;
543
+ }
544
+ return newList;
545
+ }
546
+
547
+ /**
548
+ * @brief v8::Object to RdKafka::TopicPartition
549
+ *
550
+ */
551
+ RdKafka::TopicPartition * FromV8Object(v8::Local<v8::Object> topic_partition) {
552
+ std::string topic = GetParameter<std::string>(topic_partition, "topic", "");
553
+ int partition = GetParameter<int>(topic_partition, "partition", -1);
554
+ int64_t offset = GetParameter<int64_t>(topic_partition, "offset", 0);
555
+
556
+ if (partition == -1) {
557
+ return NULL;
558
+ }
559
+
560
+ if (topic.empty()) {
561
+ return NULL;
562
+ }
563
+
564
+ RdKafka::TopicPartition *toppar =
565
+ RdKafka::TopicPartition::create(topic, partition, offset);
566
+
567
+ v8::Local<v8::String> metadataKey = Nan::New("metadata").ToLocalChecked();
568
+ if (Nan::Has(topic_partition, metadataKey).FromMaybe(false)) {
569
+ v8::Local<v8::Value> metadataValue =
570
+ Nan::Get(topic_partition, metadataKey).ToLocalChecked();
571
+
572
+ if (metadataValue->IsString()) {
573
+ Nan::Utf8String metadataValueUtf8Str(metadataValue.As<v8::String>());
574
+ std::string metadataValueStr(*metadataValueUtf8Str);
575
+ std::vector<unsigned char> metadataVector(metadataValueStr.begin(),
576
+ metadataValueStr.end());
577
+ metadataVector.push_back(
578
+ '\0'); // The null terminator is not included in the iterator.
579
+ toppar->set_metadata(metadataVector);
580
+ }
581
+ }
582
+
583
+ toppar->set_leader_epoch(-1);
584
+ v8::Local<v8::String> leaderEpochKey =
585
+ Nan::New("leaderEpoch").ToLocalChecked();
586
+ if (Nan::Has(topic_partition, leaderEpochKey).FromMaybe(false)) {
587
+ v8::Local<v8::Value> leaderEpochValue =
588
+ Nan::Get(topic_partition, leaderEpochKey).ToLocalChecked();
589
+
590
+ if (leaderEpochValue->IsNumber()) {
591
+ int32_t leaderEpoch = Nan::To<int32_t>(leaderEpochValue).FromJust();
592
+ toppar->set_leader_epoch(leaderEpoch);
593
+ }
594
+ }
595
+
596
+ return toppar;
597
+ }
598
+
599
+ } // namespace TopicPartition
600
+
601
+ namespace Metadata {
602
+
603
+ /**
604
+ * @brief RdKafka::Metadata to v8::Object
605
+ *
606
+ */
607
+ v8::Local<v8::Object> ToV8Object(RdKafka::Metadata* metadata) {
608
+ v8::Local<v8::Object> obj = Nan::New<v8::Object>();
609
+
610
+ v8::Local<v8::Array> broker_data = Nan::New<v8::Array>();
611
+ v8::Local<v8::Array> topic_data = Nan::New<v8::Array>();
612
+
613
+ const BrokerMetadataList* brokers = metadata->brokers(); // NOLINT
614
+
615
+ unsigned int broker_i = 0;
616
+
617
+ for (BrokerMetadataList::const_iterator it = brokers->begin();
618
+ it != brokers->end(); ++it, broker_i++) {
619
+ // Start iterating over brokers and set the object up
620
+
621
+ const RdKafka::BrokerMetadata* x = *it;
622
+
623
+ v8::Local<v8::Object> current_broker = Nan::New<v8::Object>();
624
+
625
+ Nan::Set(current_broker, Nan::New("id").ToLocalChecked(),
626
+ Nan::New<v8::Number>(x->id()));
627
+ Nan::Set(current_broker, Nan::New("host").ToLocalChecked(),
628
+ Nan::New<v8::String>(x->host().c_str()).ToLocalChecked());
629
+ Nan::Set(current_broker, Nan::New("port").ToLocalChecked(),
630
+ Nan::New<v8::Number>(x->port()));
631
+
632
+ Nan::Set(broker_data, broker_i, current_broker);
633
+ }
634
+
635
+ unsigned int topic_i = 0;
636
+
637
+ const TopicMetadataList* topics = metadata->topics();
638
+
639
+ for (TopicMetadataList::const_iterator it = topics->begin();
640
+ it != topics->end(); ++it, topic_i++) {
641
+ // Start iterating over topics
642
+
643
+ const RdKafka::TopicMetadata* x = *it;
644
+
645
+ v8::Local<v8::Object> current_topic = Nan::New<v8::Object>();
646
+
647
+ Nan::Set(current_topic, Nan::New("name").ToLocalChecked(),
648
+ Nan::New<v8::String>(x->topic().c_str()).ToLocalChecked());
649
+
650
+ v8::Local<v8::Array> current_topic_partitions = Nan::New<v8::Array>();
651
+
652
+ const PartitionMetadataList* current_partition_data = x->partitions();
653
+
654
+ unsigned int partition_i = 0;
655
+ PartitionMetadataList::const_iterator itt;
656
+
657
+ for (itt = current_partition_data->begin();
658
+ itt != current_partition_data->end(); ++itt, partition_i++) {
659
+ // partition iterate
660
+ const RdKafka::PartitionMetadata* xx = *itt;
661
+
662
+ v8::Local<v8::Object> current_partition = Nan::New<v8::Object>();
663
+
664
+ Nan::Set(current_partition, Nan::New("id").ToLocalChecked(),
665
+ Nan::New<v8::Number>(xx->id()));
666
+ Nan::Set(current_partition, Nan::New("leader").ToLocalChecked(),
667
+ Nan::New<v8::Number>(xx->leader()));
668
+
669
+ const std::vector<int32_t> * replicas = xx->replicas();
670
+ const std::vector<int32_t> * isrs = xx->isrs();
671
+
672
+ std::vector<int32_t>::const_iterator r_it;
673
+ std::vector<int32_t>::const_iterator i_it;
674
+
675
+ unsigned int r_i = 0;
676
+ unsigned int i_i = 0;
677
+
678
+ v8::Local<v8::Array> current_replicas = Nan::New<v8::Array>();
679
+
680
+ for (r_it = replicas->begin(); r_it != replicas->end(); ++r_it, r_i++) {
681
+ Nan::Set(current_replicas, r_i, Nan::New<v8::Int32>(*r_it));
682
+ }
683
+
684
+ v8::Local<v8::Array> current_isrs = Nan::New<v8::Array>();
685
+
686
+ for (i_it = isrs->begin(); i_it != isrs->end(); ++i_it, i_i++) {
687
+ Nan::Set(current_isrs, i_i, Nan::New<v8::Int32>(*i_it));
688
+ }
689
+
690
+ Nan::Set(current_partition, Nan::New("replicas").ToLocalChecked(),
691
+ current_replicas);
692
+ Nan::Set(current_partition, Nan::New("isrs").ToLocalChecked(),
693
+ current_isrs);
694
+
695
+ Nan::Set(current_topic_partitions, partition_i, current_partition);
696
+ } // iterate over partitions
697
+
698
+ Nan::Set(current_topic, Nan::New("partitions").ToLocalChecked(),
699
+ current_topic_partitions);
700
+
701
+ Nan::Set(topic_data, topic_i, current_topic);
702
+ } // End iterating over topics
703
+
704
+ Nan::Set(obj, Nan::New("orig_broker_id").ToLocalChecked(),
705
+ Nan::New<v8::Number>(metadata->orig_broker_id()));
706
+
707
+ Nan::Set(obj, Nan::New("orig_broker_name").ToLocalChecked(),
708
+ Nan::New<v8::String>(metadata->orig_broker_name()).ToLocalChecked());
709
+
710
+ Nan::Set(obj, Nan::New("topics").ToLocalChecked(), topic_data);
711
+ Nan::Set(obj, Nan::New("brokers").ToLocalChecked(), broker_data);
712
+
713
+ return obj;
714
+ }
715
+
716
+ } // namespace Metadata
717
+
718
+ namespace Message {
719
+
720
+ // Overload for all use cases except delivery reports
721
+ v8::Local<v8::Object> ToV8Object(RdKafka::Message *message) {
722
+ return ToV8Object(message, true, true);
723
+ }
724
+
725
+ v8::Local<v8::Object> ToV8Object(RdKafka::Message *message,
726
+ bool include_payload,
727
+ bool include_headers) {
728
+ if (message->err() == RdKafka::ERR_NO_ERROR) {
729
+ v8::Local<v8::Object> pack = Nan::New<v8::Object>();
730
+
731
+ const void* message_payload = message->payload();
732
+
733
+ if (!include_payload) {
734
+ Nan::Set(pack, Nan::New<v8::String>("value").ToLocalChecked(),
735
+ Nan::Undefined());
736
+ } else if (message_payload) {
737
+ Nan::Set(pack, Nan::New<v8::String>("value").ToLocalChecked(),
738
+ Nan::Encode(message_payload, message->len(), Nan::Encoding::BUFFER));
739
+ } else {
740
+ Nan::Set(pack, Nan::New<v8::String>("value").ToLocalChecked(),
741
+ Nan::Null());
742
+ }
743
+
744
+ RdKafka::Headers* headers;
745
+ if (((headers = message->headers()) != 0) && include_headers) {
746
+ v8::Local<v8::Array> v8headers = Nan::New<v8::Array>();
747
+ int index = 0;
748
+ std::vector<RdKafka::Headers::Header> all = headers->get_all();
749
+ for (std::vector<RdKafka::Headers::Header>::iterator it = all.begin();
750
+ it != all.end(); it++) {
751
+ v8::Local<v8::Object> v8header = Nan::New<v8::Object>();
752
+ Nan::Set(v8header, Nan::New<v8::String>(it->key()).ToLocalChecked(),
753
+ Nan::Encode(it->value_string(),
754
+ it->value_size(), Nan::Encoding::BUFFER));
755
+ Nan::Set(v8headers, index, v8header);
756
+ index++;
757
+ }
758
+ Nan::Set(pack,
759
+ Nan::New<v8::String>("headers").ToLocalChecked(), v8headers);
760
+ }
761
+
762
+ Nan::Set(pack, Nan::New<v8::String>("size").ToLocalChecked(),
763
+ Nan::New<v8::Number>(message->len()));
764
+
765
+ const void* key_payload = message->key_pointer();
766
+
767
+ if (key_payload) {
768
+ // We want this to also be a buffer to avoid corruption
769
+ // https://github.com/confluentinc/confluent-kafka-javascript/issues/208
770
+ Nan::Set(pack, Nan::New<v8::String>("key").ToLocalChecked(),
771
+ Nan::Encode(key_payload, message->key_len(), Nan::Encoding::BUFFER));
772
+ } else {
773
+ Nan::Set(pack, Nan::New<v8::String>("key").ToLocalChecked(),
774
+ Nan::Null());
775
+ }
776
+
777
+ Nan::Set(pack, Nan::New<v8::String>("topic").ToLocalChecked(),
778
+ Nan::New<v8::String>(message->topic_name()).ToLocalChecked());
779
+ Nan::Set(pack, Nan::New<v8::String>("offset").ToLocalChecked(),
780
+ Nan::New<v8::Number>(message->offset()));
781
+ Nan::Set(pack, Nan::New<v8::String>("partition").ToLocalChecked(),
782
+ Nan::New<v8::Number>(message->partition()));
783
+ Nan::Set(pack, Nan::New<v8::String>("timestamp").ToLocalChecked(),
784
+ Nan::New<v8::Number>(message->timestamp().timestamp));
785
+
786
+ int32_t leader_epoch = message->leader_epoch();
787
+ if (leader_epoch >= 0) {
788
+ Nan::Set(pack, Nan::New<v8::String>("leaderEpoch").ToLocalChecked(),
789
+ Nan::New<v8::Number>(leader_epoch));
790
+ }
791
+
792
+ return pack;
793
+ } else {
794
+ return RdKafkaError(message->err());
795
+ }
796
+ }
797
+
798
+ } // namespace Message
799
+
800
+ /**
801
+ * @section Admin API models
802
+ */
803
+
804
+ namespace Admin {
805
+
806
+ /**
807
+ * Create a low level rdkafka handle to represent a topic
808
+ *
809
+ *
810
+ */
811
+ rd_kafka_NewTopic_t* FromV8TopicObject(
812
+ v8::Local<v8::Object> object, std::string &errstr) { // NOLINT
813
+ std::string topic_name = GetParameter<std::string>(object, "topic", "");
814
+ int num_partitions = GetParameter<int>(object, "num_partitions", 0);
815
+ int replication_factor = GetParameter<int>(object, "replication_factor", 0);
816
+
817
+ char errbuf[512];
818
+
819
+ rd_kafka_NewTopic_t* new_topic = rd_kafka_NewTopic_new(
820
+ topic_name.c_str(),
821
+ num_partitions,
822
+ replication_factor,
823
+ errbuf,
824
+ sizeof(errbuf));
825
+
826
+ if (new_topic == NULL) {
827
+ errstr = std::string(errbuf);
828
+ return NULL;
829
+ }
830
+
831
+ rd_kafka_resp_err_t err;
832
+
833
+ if (Nan::Has(object, Nan::New("config").ToLocalChecked()).FromMaybe(false)) {
834
+ // Get the config v8::Object that we can get parameters on
835
+ v8::Local<v8::Object> config =
836
+ Nan::Get(object, Nan::New("config").ToLocalChecked())
837
+ .ToLocalChecked().As<v8::Object>();
838
+
839
+ // Get all of the keys of the object
840
+ v8::MaybeLocal<v8::Array> config_keys = Nan::GetOwnPropertyNames(config);
841
+
842
+ if (!config_keys.IsEmpty()) {
843
+ v8::Local<v8::Array> field_array = config_keys.ToLocalChecked();
844
+ for (size_t i = 0; i < field_array->Length(); i++) {
845
+ v8::Local<v8::String> config_key = Nan::Get(field_array, i)
846
+ .ToLocalChecked().As<v8::String>();
847
+ v8::Local<v8::Value> config_value = Nan::Get(config, config_key)
848
+ .ToLocalChecked();
849
+
850
+ // If the config value is a string...
851
+ if (config_value->IsString()) {
852
+ Nan::Utf8String pKeyVal(config_key);
853
+ std::string pKeyString(*pKeyVal);
854
+
855
+ Nan::Utf8String pValueVal(config_value.As<v8::String>());
856
+ std::string pValString(*pValueVal);
857
+
858
+ err = rd_kafka_NewTopic_set_config(
859
+ new_topic, pKeyString.c_str(), pValString.c_str());
860
+
861
+ if (err != RD_KAFKA_RESP_ERR_NO_ERROR) {
862
+ errstr = rd_kafka_err2str(err);
863
+ rd_kafka_NewTopic_destroy(new_topic);
864
+ return NULL;
865
+ }
866
+ } else {
867
+ errstr = "Config values must all be provided as strings.";
868
+ rd_kafka_NewTopic_destroy(new_topic);
869
+ return NULL;
870
+ }
871
+ }
872
+ }
873
+ }
874
+
875
+ return new_topic;
876
+ }
877
+
878
+ rd_kafka_NewTopic_t** FromV8TopicObjectArray(v8::Local<v8::Array>) {
879
+ return NULL;
880
+ }
881
+
882
+ /**
883
+ * @brief Converts a v8 array of group states into a vector of
884
+ * rd_kafka_consumer_group_state_t.
885
+ */
886
+ std::vector<rd_kafka_consumer_group_state_t> FromV8GroupStateArray(
887
+ v8::Local<v8::Array> array) {
888
+ v8::Local<v8::Array> parameter = array.As<v8::Array>();
889
+ std::vector<rd_kafka_consumer_group_state_t> returnVec;
890
+ if (parameter->Length() >= 1) {
891
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
892
+ v8::Local<v8::Value> v;
893
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
894
+ continue;
895
+ }
896
+ Nan::Maybe<int64_t> maybeT = Nan::To<int64_t>(v);
897
+ if (maybeT.IsNothing()) {
898
+ continue;
899
+ }
900
+ int64_t state_number = maybeT.FromJust();
901
+ if (state_number >= RD_KAFKA_CONSUMER_GROUP_STATE__CNT) {
902
+ continue;
903
+ }
904
+ returnVec.push_back(
905
+ static_cast<rd_kafka_consumer_group_state_t>(state_number));
906
+ }
907
+ }
908
+ return returnVec;
909
+ }
910
+
911
+ /**
912
+ * @brief Converts a v8 array of group types into a vector of
913
+ * rd_kafka_consumer_group_type_t.
914
+ */
915
+ std::vector<rd_kafka_consumer_group_type_t> FromV8GroupTypeArray(
916
+ v8::Local<v8::Array> array) {
917
+ v8::Local<v8::Array> parameter = array.As<v8::Array>();
918
+ std::vector<rd_kafka_consumer_group_type_t> returnVec;
919
+ if (parameter->Length() >= 1) {
920
+ for (unsigned int i = 0; i < parameter->Length(); i++) {
921
+ v8::Local<v8::Value> v;
922
+ if (!Nan::Get(parameter, i).ToLocal(&v)) {
923
+ continue;
924
+ }
925
+ Nan::Maybe<int64_t> maybeT = Nan::To<int64_t>(v);
926
+ if (maybeT.IsNothing()) {
927
+ continue;
928
+ }
929
+ int64_t type_number = maybeT.FromJust();
930
+ if (type_number < 0 || type_number >= RD_KAFKA_CONSUMER_GROUP_TYPE__CNT) {
931
+ continue;
932
+ }
933
+ returnVec.push_back(
934
+ static_cast<rd_kafka_consumer_group_type_t>(type_number));
935
+ }
936
+ }
937
+ return returnVec;
938
+ }
939
+
940
+ /**
941
+ * @brief Converts a rd_kafka_ListConsumerGroups_result_t* into a v8 object.
942
+ */
943
+ v8::Local<v8::Object> FromListConsumerGroupsResult(
944
+ const rd_kafka_ListConsumerGroups_result_t* result) {
945
+ /* Return object type:
946
+ {
947
+ groups: {
948
+ groupId: string,
949
+ protocolType: string,
950
+ isSimpleConsumerGroup: boolean,
951
+ state: ConsumerGroupState (internally a number)
952
+ type: ConsumerGroupType (internally a number)
953
+ }[],
954
+ errors: LibrdKafkaError[]
955
+ }
956
+ */
957
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
958
+
959
+ size_t error_cnt;
960
+ const rd_kafka_error_t** error_list =
961
+ rd_kafka_ListConsumerGroups_result_errors(result, &error_cnt);
962
+ Nan::Set(returnObject, Nan::New("errors").ToLocalChecked(),
963
+ Conversion::Util::ToV8Array(error_list, error_cnt));
964
+
965
+ v8::Local<v8::Array> groups = Nan::New<v8::Array>();
966
+ size_t groups_cnt;
967
+ const rd_kafka_ConsumerGroupListing_t** groups_list =
968
+ rd_kafka_ListConsumerGroups_result_valid(result, &groups_cnt);
969
+
970
+ for (size_t i = 0; i < groups_cnt; i++) {
971
+ const rd_kafka_ConsumerGroupListing_t* group = groups_list[i];
972
+ v8::Local<v8::Object> groupObject = Nan::New<v8::Object>();
973
+
974
+ Nan::Set(groupObject, Nan::New("groupId").ToLocalChecked(),
975
+ Nan::New<v8::String>(rd_kafka_ConsumerGroupListing_group_id(group))
976
+ .ToLocalChecked());
977
+
978
+ bool is_simple =
979
+ rd_kafka_ConsumerGroupListing_is_simple_consumer_group(group);
980
+ Nan::Set(groupObject, Nan::New("isSimpleConsumerGroup").ToLocalChecked(),
981
+ Nan::New<v8::Boolean>(is_simple));
982
+
983
+ std::string protocol_type = is_simple ? "simple" : "consumer";
984
+ Nan::Set(groupObject, Nan::New("protocolType").ToLocalChecked(),
985
+ Nan::New<v8::String>(protocol_type).ToLocalChecked());
986
+
987
+ Nan::Set(groupObject, Nan::New("state").ToLocalChecked(),
988
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupListing_state(group)));
989
+
990
+ Nan::Set(groupObject, Nan::New("type").ToLocalChecked(),
991
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupListing_type(group)));
992
+
993
+ Nan::Set(groups, i, groupObject);
994
+ }
995
+
996
+ Nan::Set(returnObject, Nan::New("groups").ToLocalChecked(), groups);
997
+ return returnObject;
998
+ }
999
+
1000
+ /**
1001
+ * @brief Converts a rd_kafka_MemberDescription_t* into a v8 object.
1002
+ */
1003
+ v8::Local<v8::Object> FromMemberDescription(
1004
+ const rd_kafka_MemberDescription_t* member) {
1005
+ /* Return object type:
1006
+ {
1007
+ clientHost: string
1008
+ clientId: string
1009
+ memberId: string
1010
+ memberAssignment: Buffer // will be always null
1011
+ memberMetadata: Buffer // will be always null
1012
+ groupInstanceId: string
1013
+ assignment: {
1014
+ topicPartitions: TopicPartition[]
1015
+ },
1016
+ targetAssignment?: {
1017
+ topicPartitions: TopicPartition[]
1018
+ }
1019
+ }
1020
+ */
1021
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
1022
+
1023
+ // clientHost
1024
+ Nan::Set(returnObject, Nan::New("clientHost").ToLocalChecked(),
1025
+ Nan::New<v8::String>(rd_kafka_MemberDescription_host(member))
1026
+ .ToLocalChecked());
1027
+
1028
+ // clientId
1029
+ Nan::Set(returnObject, Nan::New("clientId").ToLocalChecked(),
1030
+ Nan::New<v8::String>(rd_kafka_MemberDescription_client_id(member))
1031
+ .ToLocalChecked());
1032
+
1033
+ // memberId
1034
+ Nan::Set(returnObject, Nan::New("memberId").ToLocalChecked(),
1035
+ Nan::New<v8::String>(rd_kafka_MemberDescription_consumer_id(member))
1036
+ .ToLocalChecked());
1037
+
1038
+ // memberAssignment - not passed to user, always null
1039
+ Nan::Set(returnObject, Nan::New("memberAssignment").ToLocalChecked(),
1040
+ Nan::Null());
1041
+
1042
+ // memberMetadata - not passed to user, always null
1043
+ Nan::Set(returnObject, Nan::New("memberMetadata").ToLocalChecked(),
1044
+ Nan::Null());
1045
+
1046
+ // groupInstanceId
1047
+ const char* group_instance_id =
1048
+ rd_kafka_MemberDescription_group_instance_id(member);
1049
+ if (group_instance_id) {
1050
+ Nan::Set(returnObject, Nan::New("groupInstanceId").ToLocalChecked(),
1051
+ Nan::New<v8::String>(group_instance_id).ToLocalChecked());
1052
+ }
1053
+
1054
+ // assignment
1055
+ const rd_kafka_MemberAssignment_t* assignment =
1056
+ rd_kafka_MemberDescription_assignment(member);
1057
+ const rd_kafka_topic_partition_list_t* partitions =
1058
+ rd_kafka_MemberAssignment_partitions(assignment);
1059
+ v8::Local<v8::Array> topicPartitions =
1060
+ Conversion::TopicPartition::ToTopicPartitionV8Array(partitions, false);
1061
+ v8::Local<v8::Object> assignmentObject = Nan::New<v8::Object>();
1062
+ Nan::Set(assignmentObject, Nan::New("topicPartitions").ToLocalChecked(),
1063
+ topicPartitions);
1064
+ Nan::Set(returnObject, Nan::New("assignment").ToLocalChecked(),
1065
+ assignmentObject);
1066
+
1067
+ // targetAssignment
1068
+ const rd_kafka_MemberAssignment_t* target_assignment =
1069
+ rd_kafka_MemberDescription_target_assignment(member);
1070
+ if (target_assignment) {
1071
+ const rd_kafka_topic_partition_list_t* target_partitions =
1072
+ rd_kafka_MemberAssignment_partitions(target_assignment);
1073
+ v8::Local<v8::Array> targetTopicPartitions =
1074
+ Conversion::TopicPartition::ToTopicPartitionV8Array(
1075
+ target_partitions, false);
1076
+ v8::Local<v8::Object> targetAssignmentObject = Nan::New<v8::Object>();
1077
+ Nan::Set(targetAssignmentObject,
1078
+ Nan::New("topicPartitions").ToLocalChecked(),
1079
+ targetTopicPartitions);
1080
+ Nan::Set(returnObject, Nan::New("targetAssignment").ToLocalChecked(),
1081
+ targetAssignmentObject);
1082
+ }
1083
+
1084
+ return returnObject;
1085
+ }
1086
+
1087
+ /**
1088
+ * @brief Converts a rd_kafka_ConsumerGroupDescription_t* into a v8 object.
1089
+ */
1090
+ v8::Local<v8::Object> FromConsumerGroupDescription(
1091
+ const rd_kafka_ConsumerGroupDescription_t* desc) {
1092
+ /* Return object type:
1093
+ {
1094
+ groupId: string,
1095
+ error: LibrdKafkaError,
1096
+ members: MemberDescription[],
1097
+ protocol: string
1098
+ isSimpleConsumerGroup: boolean
1099
+ protocolType: string
1100
+ partitionAssignor: string
1101
+ state: ConsumerGroupState - internally a number
1102
+ coordinator: Node
1103
+ authorizedOperations: AclOperationType[] - internally numbers
1104
+ }
1105
+ */
1106
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
1107
+
1108
+ // groupId
1109
+ Nan::Set(
1110
+ returnObject, Nan::New("groupId").ToLocalChecked(),
1111
+ Nan::New<v8::String>(rd_kafka_ConsumerGroupDescription_group_id(desc))
1112
+ .ToLocalChecked());
1113
+
1114
+ // error
1115
+ const rd_kafka_error_t* error = rd_kafka_ConsumerGroupDescription_error(desc);
1116
+ if (error) {
1117
+ RdKafka::ErrorCode code =
1118
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error));
1119
+ std::string msg = std::string(rd_kafka_error_string(error));
1120
+ Nan::Set(returnObject, Nan::New("error").ToLocalChecked(),
1121
+ RdKafkaError(code, msg));
1122
+ }
1123
+
1124
+ // members
1125
+ v8::Local<v8::Array> members = Nan::New<v8::Array>();
1126
+ size_t member_cnt = rd_kafka_ConsumerGroupDescription_member_count(desc);
1127
+ for (size_t i = 0; i < member_cnt; i++) {
1128
+ const rd_kafka_MemberDescription_t* member =
1129
+ rd_kafka_ConsumerGroupDescription_member(desc, i);
1130
+ Nan::Set(members, i, FromMemberDescription(member));
1131
+ }
1132
+ Nan::Set(returnObject, Nan::New("members").ToLocalChecked(), members);
1133
+
1134
+ // isSimpleConsumerGroup
1135
+ bool is_simple =
1136
+ rd_kafka_ConsumerGroupDescription_is_simple_consumer_group(desc);
1137
+ Nan::Set(returnObject, Nan::New("isSimpleConsumerGroup").ToLocalChecked(),
1138
+ Nan::New<v8::Boolean>(is_simple));
1139
+
1140
+ // protocolType
1141
+ std::string protocolType = is_simple ? "simple" : "consumer";
1142
+ Nan::Set(returnObject, Nan::New("protocolType").ToLocalChecked(),
1143
+ Nan::New<v8::String>(protocolType).ToLocalChecked());
1144
+
1145
+ // protocol
1146
+ Nan::Set(returnObject, Nan::New("protocol").ToLocalChecked(),
1147
+ Nan::New<v8::String>(
1148
+ rd_kafka_ConsumerGroupDescription_partition_assignor(desc))
1149
+ .ToLocalChecked());
1150
+
1151
+ // partitionAssignor
1152
+ Nan::Set(returnObject, Nan::New("partitionAssignor").ToLocalChecked(),
1153
+ Nan::New<v8::String>(
1154
+ rd_kafka_ConsumerGroupDescription_partition_assignor(desc))
1155
+ .ToLocalChecked());
1156
+
1157
+ // state
1158
+ Nan::Set(returnObject, Nan::New("state").ToLocalChecked(),
1159
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupDescription_state(desc)));
1160
+
1161
+ // type
1162
+ Nan::Set(returnObject, Nan::New("type").ToLocalChecked(),
1163
+ Nan::New<v8::Number>(rd_kafka_ConsumerGroupDescription_type(desc)));
1164
+
1165
+ // coordinator
1166
+ const rd_kafka_Node_t* coordinator =
1167
+ rd_kafka_ConsumerGroupDescription_coordinator(desc);
1168
+ if (coordinator) {
1169
+ v8::Local<v8::Object> coordinatorObject =
1170
+ Conversion::Util::ToV8Object(coordinator);
1171
+ Nan::Set(returnObject, Nan::New("coordinator").ToLocalChecked(),
1172
+ coordinatorObject);
1173
+ }
1174
+
1175
+ // authorizedOperations
1176
+ size_t authorized_operations_cnt;
1177
+ const rd_kafka_AclOperation_t* authorized_operations =
1178
+ rd_kafka_ConsumerGroupDescription_authorized_operations(
1179
+ desc, &authorized_operations_cnt);
1180
+ if (authorized_operations) {
1181
+ Nan::Set(returnObject, Nan::New("authorizedOperations").ToLocalChecked(),
1182
+ Conversion::Util::ToV8Array(authorized_operations,
1183
+ authorized_operations_cnt));
1184
+ }
1185
+
1186
+ return returnObject;
1187
+ }
1188
+
1189
+ /**
1190
+ * @brief Converts a rd_kafka_DescribeConsumerGroups_result_t* into a v8 object.
1191
+ */
1192
+ v8::Local<v8::Object> FromDescribeConsumerGroupsResult(
1193
+ const rd_kafka_DescribeConsumerGroups_result_t* result) {
1194
+ /* Return object type:
1195
+ { groups: GroupDescription[] }
1196
+ */
1197
+ v8::Local<v8::Object> returnObject = Nan::New<v8::Object>();
1198
+ v8::Local<v8::Array> groups = Nan::New<v8::Array>();
1199
+ size_t groups_cnt;
1200
+ const rd_kafka_ConsumerGroupDescription_t** groups_list =
1201
+ rd_kafka_DescribeConsumerGroups_result_groups(result, &groups_cnt);
1202
+
1203
+ for (size_t i = 0; i < groups_cnt; i++) {
1204
+ const rd_kafka_ConsumerGroupDescription_t* group = groups_list[i];
1205
+ Nan::Set(groups, i, FromConsumerGroupDescription(group));
1206
+ }
1207
+
1208
+ Nan::Set(returnObject, Nan::New("groups").ToLocalChecked(), groups);
1209
+ return returnObject;
1210
+ }
1211
+
1212
+ /**
1213
+ * @brief Converts a rd_kafka_DeleteGroups_result_t* into a v8 array.
1214
+ */
1215
+ v8::Local<v8::Array> FromDeleteGroupsResult(
1216
+ const rd_kafka_DeleteGroups_result_t* result) {
1217
+ /* Return object type:
1218
+ [{
1219
+ groupId: string
1220
+ errorCode?: number
1221
+ error?: LibrdKafkaError
1222
+ }]
1223
+ */
1224
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
1225
+ size_t result_cnt;
1226
+ const rd_kafka_group_result_t** results =
1227
+ rd_kafka_DeleteGroups_result_groups(result, &result_cnt);
1228
+
1229
+ for (size_t i = 0; i < result_cnt; i++) {
1230
+ const rd_kafka_group_result_t* group_result = results[i];
1231
+ v8::Local<v8::Object> group_object = Nan::New<v8::Object>();
1232
+
1233
+ Nan::Set(group_object, Nan::New("groupId").ToLocalChecked(),
1234
+ Nan::New<v8::String>(rd_kafka_group_result_name(group_result))
1235
+ .ToLocalChecked());
1236
+
1237
+ const rd_kafka_error_t* error = rd_kafka_group_result_error(group_result);
1238
+ if (!error) {
1239
+ Nan::Set(group_object, Nan::New("errorCode").ToLocalChecked(),
1240
+ Nan::New<v8::Number>(RD_KAFKA_RESP_ERR_NO_ERROR));
1241
+ } else {
1242
+ RdKafka::ErrorCode code =
1243
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error));
1244
+ const char* msg = rd_kafka_error_string(error);
1245
+
1246
+ Nan::Set(group_object, Nan::New("errorCode").ToLocalChecked(),
1247
+ Nan::New<v8::Number>(code));
1248
+ Nan::Set(group_object, Nan::New("error").ToLocalChecked(),
1249
+ RdKafkaError(code, msg));
1250
+ }
1251
+ Nan::Set(returnArray, i, group_object);
1252
+ }
1253
+
1254
+ return returnArray;
1255
+ }
1256
+
1257
+ /**
1258
+ * @brief Converts a rd_kafka_ListConsumerGroupOffsets_result_t*
1259
+ * into a v8 Array.
1260
+ */
1261
+ v8::Local<v8::Array> FromListConsumerGroupOffsetsResult(
1262
+ const rd_kafka_ListConsumerGroupOffsets_result_t* result) {
1263
+ /* Return Object type:
1264
+ GroupResults[] = [{
1265
+ groupId : string,
1266
+ error? : LibrdKafkaError,
1267
+ partitions : TopicPartitionOffset[]
1268
+ }]
1269
+
1270
+ TopicPartitionOffset:
1271
+ {
1272
+ topic : string,
1273
+ partition : number,
1274
+ offset : number,
1275
+ metadata : string | null,
1276
+ leaderEpoch? : number,
1277
+ error? : LibrdKafkaError
1278
+ }
1279
+ */
1280
+
1281
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
1282
+ size_t result_cnt;
1283
+ const rd_kafka_group_result_t** res =
1284
+ rd_kafka_ListConsumerGroupOffsets_result_groups(result, &result_cnt);
1285
+
1286
+ for (size_t i = 0; i < result_cnt; i++) {
1287
+ const rd_kafka_group_result_t* group_result = res[i];
1288
+
1289
+ // Create group result object
1290
+ v8::Local<v8::Object> group_object = Nan::New<v8::Object>();
1291
+
1292
+ // Set groupId
1293
+ std::string groupId = rd_kafka_group_result_name(group_result);
1294
+ Nan::Set(group_object, Nan::New("groupId").ToLocalChecked(),
1295
+ Nan::New<v8::String>(groupId.c_str()).ToLocalChecked());
1296
+
1297
+ // Set group-level error (if any)
1298
+ const rd_kafka_error_t* group_error =
1299
+ rd_kafka_group_result_error(group_result);
1300
+ if (group_error) {
1301
+ RdKafka::ErrorCode code =
1302
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(group_error));
1303
+ const char* msg = rd_kafka_error_string(group_error);
1304
+ Nan::Set(group_object, Nan::New("error").ToLocalChecked(),
1305
+ RdKafkaError(code, msg));
1306
+ }
1307
+
1308
+ // Get the list of partitions for this group
1309
+ const rd_kafka_topic_partition_list_t* partitionList =
1310
+ rd_kafka_group_result_partitions(group_result);
1311
+
1312
+ // Prepare array for TopicPartitionOffset[]
1313
+ v8::Local<v8::Array> partitionsArray = Nan::New<v8::Array>();
1314
+ int partitionIndex = 0;
1315
+
1316
+ for (int j = 0; j < partitionList->cnt; j++) {
1317
+ const rd_kafka_topic_partition_t* partition = &partitionList->elems[j];
1318
+
1319
+ // Create the TopicPartitionOffset object
1320
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1321
+
1322
+ // Set topic, partition, and offset
1323
+ Nan::Set(partition_object, Nan::New("topic").ToLocalChecked(),
1324
+ Nan::New<v8::String>(partition->topic).ToLocalChecked());
1325
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1326
+ Nan::New<v8::Number>(partition->partition));
1327
+ Nan::Set(partition_object, Nan::New("offset").ToLocalChecked(),
1328
+ Nan::New<v8::Number>(partition->offset));
1329
+
1330
+ // Set metadata (if available)
1331
+ if (partition->metadata != nullptr) {
1332
+ Nan::Set(
1333
+ partition_object, Nan::New("metadata").ToLocalChecked(),
1334
+ Nan::New<v8::String>(static_cast<const char*>(partition->metadata))
1335
+ .ToLocalChecked());
1336
+ } else {
1337
+ Nan::Set(partition_object, Nan::New("metadata").ToLocalChecked(),
1338
+ Nan::Null());
1339
+ }
1340
+
1341
+ // Set leaderEpoch (if available)
1342
+ int32_t leader_epoch =
1343
+ rd_kafka_topic_partition_get_leader_epoch(partition);
1344
+ if (leader_epoch >= 0) {
1345
+ Nan::Set(partition_object, Nan::New("leaderEpoch").ToLocalChecked(),
1346
+ Nan::New<v8::Number>(leader_epoch));
1347
+ }
1348
+
1349
+ // Set partition-level error (if any)
1350
+ if (partition->err != RD_KAFKA_RESP_ERR_NO_ERROR) {
1351
+ RdKafka::ErrorCode code =
1352
+ static_cast<RdKafka::ErrorCode>(partition->err);
1353
+ Nan::Set(group_object, Nan::New("error").ToLocalChecked(),
1354
+ RdKafkaError(code, rd_kafka_err2str(partition->err)));
1355
+ }
1356
+
1357
+ Nan::Set(partitionsArray, partitionIndex++, partition_object);
1358
+ }
1359
+
1360
+ Nan::Set(group_object, Nan::New("partitions").ToLocalChecked(),
1361
+ partitionsArray);
1362
+
1363
+ Nan::Set(returnArray, i, group_object);
1364
+ }
1365
+
1366
+ return returnArray;
1367
+ }
1368
+
1369
+ /**
1370
+ * @brief Converts a rd_kafka_DeleteRecords_result_t* into a v8 Array.
1371
+ */
1372
+ v8::Local<v8::Array> FromDeleteRecordsResult(
1373
+ const rd_kafka_DeleteRecords_result_t* result) {
1374
+ /* Return object type:
1375
+ [{
1376
+ topic: string,
1377
+ partition: number,
1378
+ lowWatermark: number,
1379
+ error?: LibrdKafkaError
1380
+ }]
1381
+ */
1382
+ const rd_kafka_topic_partition_list_t* partitionList =
1383
+ rd_kafka_DeleteRecords_result_offsets(result);
1384
+
1385
+ v8::Local<v8::Array> partitionsArray = Nan::New<v8::Array>();
1386
+ int partitionIndex = 0;
1387
+
1388
+ for (int j = 0; j < partitionList->cnt; j++) {
1389
+ const rd_kafka_topic_partition_t* partition = &partitionList->elems[j];
1390
+
1391
+ // Create the TopicPartitionOffset object
1392
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1393
+
1394
+ // Set topic, partition, and offset and error(if required)
1395
+ Nan::Set(partition_object, Nan::New("topic").ToLocalChecked(),
1396
+ Nan::New<v8::String>(partition->topic).ToLocalChecked());
1397
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1398
+ Nan::New<v8::Number>(partition->partition));
1399
+ Nan::Set(partition_object, Nan::New("lowWatermark").ToLocalChecked(),
1400
+ Nan::New<v8::Number>(partition->offset));
1401
+
1402
+ if (partition->err != RD_KAFKA_RESP_ERR_NO_ERROR) {
1403
+ RdKafka::ErrorCode code = static_cast<RdKafka::ErrorCode>(partition->err);
1404
+ Nan::Set(partition_object, Nan::New("error").ToLocalChecked(),
1405
+ RdKafkaError(code, rd_kafka_err2str(partition->err)));
1406
+ }
1407
+
1408
+ Nan::Set(partitionsArray, partitionIndex++, partition_object);
1409
+ }
1410
+
1411
+ return partitionsArray;
1412
+ }
1413
+
1414
+ /**
1415
+ * @brief Converts a rd_kafka_DescribeTopics_result_t* into a v8 Array.
1416
+ */
1417
+ v8::Local<v8::Array> FromDescribeTopicsResult(
1418
+ const rd_kafka_DescribeTopics_result_t* result) {
1419
+ /* Return object type:
1420
+ [{
1421
+ name: string,
1422
+ topicId: Uuid,
1423
+ isInternal: boolean,
1424
+ partitions: [{
1425
+ partition: number,
1426
+ leader: Node,
1427
+ isr: Node[],
1428
+ replicas: Node[],
1429
+ }]
1430
+ error?: LibrdKafkaError,
1431
+ authorizedOperations?: AclOperationType[]
1432
+ }]
1433
+ */
1434
+
1435
+ /*
1436
+ Node:
1437
+ {
1438
+ id: number,
1439
+ host: string,
1440
+ port: number
1441
+ rack?: string
1442
+ }
1443
+ */
1444
+
1445
+ v8::Local<v8::Array> returnArray = Nan::New<v8::Array>();
1446
+ size_t result_cnt;
1447
+ const rd_kafka_TopicDescription_t** results =
1448
+ rd_kafka_DescribeTopics_result_topics(result, &result_cnt);
1449
+
1450
+ int topicIndex = 0;
1451
+
1452
+ for (size_t i = 0; i < result_cnt; i++) {
1453
+ v8::Local<v8::Object> topic_object = Nan::New<v8::Object>();
1454
+
1455
+ const char* topic_name = rd_kafka_TopicDescription_name(results[i]);
1456
+ Nan::Set(topic_object, Nan::New("name").ToLocalChecked(),
1457
+ Nan::New<v8::String>(topic_name).ToLocalChecked());
1458
+
1459
+ const rd_kafka_Uuid_t* topic_id =
1460
+ rd_kafka_TopicDescription_topic_id(results[i]);
1461
+ Nan::Set(topic_object, Nan::New("topicId").ToLocalChecked(),
1462
+ Conversion::Util::UuidToV8Object(topic_id));
1463
+
1464
+ int is_internal = rd_kafka_TopicDescription_is_internal(results[i]);
1465
+ Nan::Set(topic_object, Nan::New("isInternal").ToLocalChecked(),
1466
+ Nan::New<v8::Boolean>(is_internal));
1467
+
1468
+ const rd_kafka_error_t* error = rd_kafka_TopicDescription_error(results[i]);
1469
+ if (error) {
1470
+ RdKafka::ErrorCode code =
1471
+ static_cast<RdKafka::ErrorCode>(rd_kafka_error_code(error));
1472
+ Nan::Set(topic_object, Nan::New("error").ToLocalChecked(),
1473
+ RdKafkaError(code, rd_kafka_error_string(error)));
1474
+ }
1475
+
1476
+ size_t authorized_operations_cnt;
1477
+ const rd_kafka_AclOperation_t* authorized_operations =
1478
+ rd_kafka_TopicDescription_authorized_operations(
1479
+ results[i], &authorized_operations_cnt);
1480
+ if (authorized_operations) {
1481
+ Nan::Set(topic_object, Nan::New("authorizedOperations").ToLocalChecked(),
1482
+ Conversion::Util::ToV8Array(authorized_operations,
1483
+ authorized_operations_cnt));
1484
+ }
1485
+
1486
+ size_t partition_cnt;
1487
+ const rd_kafka_TopicPartitionInfo_t** partitions =
1488
+ rd_kafka_TopicDescription_partitions(results[i], &partition_cnt);
1489
+ v8::Local<v8::Array> partitionsArray = Nan::New<v8::Array>();
1490
+ for (size_t j = 0; j < partition_cnt; j++) {
1491
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1492
+ const rd_kafka_TopicPartitionInfo_t* partition = partitions[j];
1493
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1494
+ Nan::New<v8::Number>(
1495
+ rd_kafka_TopicPartitionInfo_partition(partition)));
1496
+
1497
+ const rd_kafka_Node_t* leader =
1498
+ rd_kafka_TopicPartitionInfo_leader(partition);
1499
+ Nan::Set(partition_object, Nan::New("leader").ToLocalChecked(),
1500
+ Conversion::Util::ToV8Object(leader));
1501
+
1502
+ size_t isr_cnt;
1503
+ const rd_kafka_Node_t** isr =
1504
+ rd_kafka_TopicPartitionInfo_isr(partition, &isr_cnt);
1505
+ v8::Local<v8::Array> isrArray = Nan::New<v8::Array>();
1506
+ for (size_t k = 0; k < isr_cnt; k++) {
1507
+ Nan::Set(isrArray, k, Conversion::Util::ToV8Object(isr[k]));
1508
+ }
1509
+ Nan::Set(partition_object, Nan::New("isr").ToLocalChecked(), isrArray);
1510
+
1511
+ size_t replicas_cnt;
1512
+ const rd_kafka_Node_t** replicas =
1513
+ rd_kafka_TopicPartitionInfo_replicas(partition, &replicas_cnt);
1514
+ v8::Local<v8::Array> replicasArray = Nan::New<v8::Array>();
1515
+ for (size_t k = 0; k < replicas_cnt; k++) {
1516
+ Nan::Set(replicasArray, k, Conversion::Util::ToV8Object(replicas[k]));
1517
+ }
1518
+ Nan::Set(partition_object, Nan::New("replicas").ToLocalChecked(),
1519
+ replicasArray);
1520
+
1521
+ Nan::Set(partitionsArray, j, partition_object);
1522
+ }
1523
+ Nan::Set(topic_object, Nan::New("partitions").ToLocalChecked(),
1524
+ partitionsArray);
1525
+
1526
+ Nan::Set(returnArray, topicIndex++, topic_object);
1527
+ }
1528
+
1529
+ return returnArray;
1530
+ }
1531
+
1532
+ /**
1533
+ * @brief Converts a rd_kafka_ListOffsets_result_t* into a v8 Array.
1534
+ */
1535
+ v8::Local<v8::Array> FromListOffsetsResult(
1536
+ const rd_kafka_ListOffsets_result_t* result) {
1537
+ /* Return object type:
1538
+ [{
1539
+ topic: string,
1540
+ partition: number,
1541
+ offset: number,
1542
+ error: LibrdKafkaError
1543
+ timestamp: number
1544
+ }]
1545
+ */
1546
+
1547
+ size_t result_cnt, i;
1548
+ const rd_kafka_ListOffsetsResultInfo_t** results =
1549
+ rd_kafka_ListOffsets_result_infos(result, &result_cnt);
1550
+
1551
+ v8::Local<v8::Array> resultArray = Nan::New<v8::Array>();
1552
+ int partitionIndex = 0;
1553
+
1554
+ for (i = 0; i < result_cnt; i++) {
1555
+ const rd_kafka_topic_partition_t* partition =
1556
+ rd_kafka_ListOffsetsResultInfo_topic_partition(results[i]);
1557
+ int64_t timestamp = rd_kafka_ListOffsetsResultInfo_timestamp(results[i]);
1558
+
1559
+ // Create the ListOffsetsResult object
1560
+ v8::Local<v8::Object> partition_object = Nan::New<v8::Object>();
1561
+
1562
+ // Set topic, partition, offset, error and timestamp
1563
+ Nan::Set(partition_object, Nan::New("topic").ToLocalChecked(),
1564
+ Nan::New<v8::String>(partition->topic).ToLocalChecked());
1565
+ Nan::Set(partition_object, Nan::New("partition").ToLocalChecked(),
1566
+ Nan::New<v8::Number>(partition->partition));
1567
+ Nan::Set(partition_object, Nan::New("offset").ToLocalChecked(),
1568
+ Nan::New<v8::Number>(partition->offset));
1569
+ if (partition->err != RD_KAFKA_RESP_ERR_NO_ERROR) {
1570
+ RdKafka::ErrorCode code = static_cast<RdKafka::ErrorCode>(partition->err);
1571
+ Nan::Set(partition_object, Nan::New("error").ToLocalChecked(),
1572
+ RdKafkaError(code, rd_kafka_err2str(partition->err)));
1573
+ }
1574
+ // Set leaderEpoch (if available)
1575
+ int32_t leader_epoch =
1576
+ rd_kafka_topic_partition_get_leader_epoch(partition);
1577
+ if (leader_epoch >= 0) {
1578
+ Nan::Set(partition_object, Nan::New("leaderEpoch").ToLocalChecked(),
1579
+ Nan::New<v8::Number>(leader_epoch));
1580
+ }
1581
+ Nan::Set(partition_object, Nan::New("timestamp").ToLocalChecked(),
1582
+ Nan::New<v8::Number>(timestamp));
1583
+
1584
+ Nan::Set(resultArray, partitionIndex++, partition_object);
1585
+ }
1586
+
1587
+ return resultArray;
1588
+ }
1589
+
1590
+ } // namespace Admin
1591
+
1592
+ } // namespace Conversion
1593
+
1594
+ namespace Util {
1595
+ std::string FromV8String(v8::Local<v8::String> val) {
1596
+ Nan::Utf8String keyUTF8(val);
1597
+ return std::string(*keyUTF8);
1598
+ }
1599
+ } // Namespace Util
1600
+
1601
+ } // namespace NodeKafka