tigerbeetle 0.0.36 → 0.0.38

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 (248) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/ext/tb_client/extconf.rb +13 -13
  4. data/ext/tb_client/tigerbeetle/LICENSE +177 -0
  5. data/ext/tb_client/tigerbeetle/build.zig +2327 -0
  6. data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
  7. data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
  8. data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
  9. data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
  10. data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
  11. data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
  12. data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
  13. data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
  14. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1092 -0
  15. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
  16. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
  17. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
  18. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
  19. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
  20. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
  21. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
  22. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
  23. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
  24. data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
  25. data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
  26. data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
  27. data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
  28. data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
  29. data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
  30. data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
  31. data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
  32. data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
  33. data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
  34. data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
  35. data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
  36. data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
  37. data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
  38. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
  39. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
  40. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
  41. data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
  42. data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
  43. data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
  44. data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
  45. data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
  46. data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
  47. data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
  48. data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
  49. data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
  50. data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
  51. data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
  52. data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
  53. data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
  54. data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
  55. data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
  56. data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
  57. data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
  58. data/ext/tb_client/tigerbeetle/src/direction.zig +120 -0
  59. data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
  60. data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
  61. data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
  62. data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
  63. data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
  64. data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
  65. data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
  66. data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
  67. data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
  68. data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
  69. data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
  70. data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
  71. data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
  72. data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
  73. data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
  74. data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
  75. data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
  76. data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
  77. data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
  78. data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
  79. data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
  80. data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
  81. data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
  82. data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
  83. data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
  84. data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
  85. data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
  86. data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
  87. data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
  88. data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
  89. data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
  90. data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
  91. data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
  92. data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
  93. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
  94. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
  95. data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
  96. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
  97. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
  98. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
  99. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
  100. data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
  101. data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
  102. data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
  103. data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
  104. data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
  105. data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +359 -0
  106. data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
  107. data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
  108. data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +962 -0
  109. data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
  110. data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
  111. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
  112. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
  113. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
  114. data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
  115. data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
  116. data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
  117. data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +90 -0
  118. data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
  119. data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
  120. data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
  121. data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +534 -0
  122. data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
  123. data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
  124. data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
  125. data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
  126. data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
  127. data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
  128. data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
  129. data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
  130. data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
  131. data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
  132. data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
  133. data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
  134. data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
  135. data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
  136. data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
  137. data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
  138. data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
  139. data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
  140. data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
  141. data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
  142. data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
  143. data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
  144. data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
  145. data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
  146. data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
  147. data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
  148. data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
  149. data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
  150. data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
  151. data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
  152. data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
  153. data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
  154. data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
  155. data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
  156. data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
  157. data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
  158. data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
  159. data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
  160. data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
  161. data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
  162. data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
  163. data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
  164. data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
  165. data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
  166. data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
  167. data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
  168. data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
  169. data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
  170. data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
  171. data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
  172. data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
  173. data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
  174. data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
  175. data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
  176. data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
  177. data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
  178. data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
  179. data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
  180. data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
  181. data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
  182. data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
  183. data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
  184. data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
  185. data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
  186. data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
  187. data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
  188. data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
  189. data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
  190. data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
  191. data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
  192. data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
  193. data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
  194. data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
  195. data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
  196. data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
  197. data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
  198. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
  199. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
  200. data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
  201. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
  202. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
  203. data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
  204. data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
  205. data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
  206. data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
  207. data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
  208. data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
  209. data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
  210. data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
  211. data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
  212. data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
  213. data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
  214. data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
  215. data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
  216. data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
  217. data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
  218. data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
  219. data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
  220. data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
  221. data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
  222. data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
  223. data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
  224. data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
  225. data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
  226. data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
  227. data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
  228. data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
  229. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
  230. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
  231. data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
  232. data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
  233. data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
  234. data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
  235. data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2928 -0
  236. data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
  237. data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
  238. data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
  239. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
  240. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
  241. data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
  242. data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
  243. data/lib/tb_client/shared_lib.rb +12 -5
  244. data/lib/tigerbeetle/platforms.rb +9 -0
  245. data/lib/tigerbeetle/version.rb +2 -2
  246. data/tigerbeetle.gemspec +22 -5
  247. metadata +242 -3
  248. data/ext/tb_client/pkg.tar.gz +0 -0
@@ -0,0 +1,267 @@
1
+ const std = @import("std");
2
+ const vsr = @import("vsr");
3
+
4
+ const assert = std.debug.assert;
5
+ const tb = vsr.tigerbeetle;
6
+ const tb_client = vsr.tb_client;
7
+
8
+ const TypeMapping = struct {
9
+ name: []const u8,
10
+ hidden_fields: []const []const u8 = &.{},
11
+ docs_link: ?[]const u8 = null,
12
+
13
+ pub fn hidden(comptime self: @This(), name: []const u8) bool {
14
+ inline for (self.hidden_fields) |field| {
15
+ if (std.mem.eql(u8, field, name)) {
16
+ return true;
17
+ }
18
+ } else return false;
19
+ }
20
+ };
21
+
22
+ const type_mappings = .{
23
+ .{ tb.AccountFlags, TypeMapping{
24
+ .name = "AccountFlags",
25
+ .hidden_fields = &.{"padding"},
26
+ .docs_link = "reference/account#flags",
27
+ } },
28
+ .{ tb.TransferFlags, TypeMapping{
29
+ .name = "TransferFlags",
30
+ .hidden_fields = &.{"padding"},
31
+ .docs_link = "reference/transfer#flags",
32
+ } },
33
+ .{ tb.AccountFilterFlags, TypeMapping{
34
+ .name = "AccountFilterFlags",
35
+ .hidden_fields = &.{"padding"},
36
+ .docs_link = "reference/account-filter#flags",
37
+ } },
38
+ .{ tb.QueryFilterFlags, TypeMapping{
39
+ .name = "QueryFilterFlags",
40
+ .hidden_fields = &.{"padding"},
41
+ .docs_link = "reference/query-filter#flags",
42
+ } },
43
+ .{ tb.Account, TypeMapping{
44
+ .name = "Account",
45
+ .docs_link = "reference/account/#",
46
+ } },
47
+ .{ tb.Transfer, TypeMapping{
48
+ .name = "Transfer",
49
+ .docs_link = "reference/transfer/#",
50
+ } },
51
+ .{ tb.CreateAccountResult, TypeMapping{
52
+ .name = "CreateAccountError",
53
+ .docs_link = "reference/requests/create_accounts#",
54
+ } },
55
+ .{ tb.CreateTransferResult, TypeMapping{
56
+ .name = "CreateTransferError",
57
+ .docs_link = "reference/requests/create_transfers#",
58
+ } },
59
+ .{ tb.CreateAccountsResult, TypeMapping{
60
+ .name = "CreateAccountsError",
61
+ } },
62
+ .{ tb.CreateTransfersResult, TypeMapping{
63
+ .name = "CreateTransfersError",
64
+ } },
65
+ .{ tb.AccountFilter, TypeMapping{
66
+ .name = "AccountFilter",
67
+ .hidden_fields = &.{"reserved"},
68
+ .docs_link = "reference/account-filter#",
69
+ } },
70
+ .{ tb.QueryFilter, TypeMapping{
71
+ .name = "QueryFilter",
72
+ .hidden_fields = &.{"reserved"},
73
+ .docs_link = "reference/query-filter#",
74
+ } },
75
+ .{ tb.AccountBalance, TypeMapping{
76
+ .name = "AccountBalance",
77
+ .hidden_fields = &.{"reserved"},
78
+ .docs_link = "reference/account-balances#",
79
+ } },
80
+ .{ tb_client.Operation, TypeMapping{
81
+ .name = "Operation",
82
+ .hidden_fields = &.{ "reserved", "root", "register" },
83
+ } },
84
+ };
85
+
86
+ fn typescript_type(comptime Type: type) []const u8 {
87
+ switch (@typeInfo(Type)) {
88
+ .@"enum" => return comptime get_mapped_type_name(Type) orelse @compileError(
89
+ "Type " ++ @typeName(Type) ++ " not mapped.",
90
+ ),
91
+ .@"struct" => |info| switch (info.layout) {
92
+ .@"packed" => return comptime typescript_type(
93
+ std.meta.Int(.unsigned, @bitSizeOf(Type)),
94
+ ),
95
+ else => return comptime get_mapped_type_name(Type) orelse @compileError(
96
+ "Type " ++ @typeName(Type) ++ " not mapped.",
97
+ ),
98
+ },
99
+ .int => |info| {
100
+ assert(info.signedness == .unsigned);
101
+ return switch (info.bits) {
102
+ 16 => "number",
103
+ 32 => "number",
104
+ 64 => "bigint",
105
+ 128 => "bigint",
106
+ else => @compileError("invalid int type: " ++ @typeName(Type)),
107
+ };
108
+ },
109
+ else => @compileError("Unhandled type: " ++ @typeName(Type)),
110
+ }
111
+ }
112
+
113
+ fn get_mapped_type_name(comptime Type: type) ?[]const u8 {
114
+ inline for (type_mappings) |type_mapping| {
115
+ if (Type == type_mapping[0]) {
116
+ return type_mapping[1].name;
117
+ }
118
+ } else return null;
119
+ }
120
+
121
+ fn emit_enum(
122
+ buffer: *std.ArrayList(u8),
123
+ comptime Type: type,
124
+ comptime mapping: TypeMapping,
125
+ ) !void {
126
+ try emit_docs(buffer, mapping, 0, null);
127
+
128
+ try buffer.writer().print("export enum {s} {{\n", .{mapping.name});
129
+
130
+ inline for (@typeInfo(Type).@"enum".fields) |field| {
131
+ if (comptime std.mem.startsWith(u8, field.name, "deprecated_")) continue;
132
+ if (comptime mapping.hidden(field.name)) continue;
133
+
134
+ try emit_docs(buffer, mapping, 1, field.name);
135
+
136
+ try buffer.writer().print(" {s} = {d},\n", .{
137
+ field.name,
138
+ @intFromEnum(@field(Type, field.name)),
139
+ });
140
+ }
141
+
142
+ try buffer.writer().print("}}\n\n", .{});
143
+ }
144
+
145
+ fn emit_packed_struct(
146
+ buffer: *std.ArrayList(u8),
147
+ comptime type_info: anytype,
148
+ comptime mapping: TypeMapping,
149
+ ) !void {
150
+ assert(type_info.layout == .@"packed");
151
+ try emit_docs(buffer, mapping, 0, null);
152
+
153
+ try buffer.writer().print(
154
+ \\export enum {s} {{
155
+ \\ none = 0,
156
+ \\
157
+ , .{mapping.name});
158
+
159
+ inline for (type_info.fields, 0..) |field, i| {
160
+ if (comptime mapping.hidden(field.name)) continue;
161
+
162
+ try emit_docs(buffer, mapping, 1, field.name);
163
+
164
+ try buffer.writer().print(" {s} = (1 << {d}),\n", .{
165
+ field.name,
166
+ i,
167
+ });
168
+ }
169
+
170
+ try buffer.writer().print("}}\n\n", .{});
171
+ }
172
+
173
+ fn emit_struct(
174
+ buffer: *std.ArrayList(u8),
175
+ comptime type_info: anytype,
176
+ comptime mapping: TypeMapping,
177
+ ) !void {
178
+ try emit_docs(buffer, mapping, 0, null);
179
+
180
+ try buffer.writer().print("export type {s} = {{\n", .{
181
+ mapping.name,
182
+ });
183
+
184
+ inline for (type_info.fields) |field| {
185
+ if (comptime mapping.hidden(field.name)) continue;
186
+
187
+ try emit_docs(buffer, mapping, 1, field.name);
188
+
189
+ switch (@typeInfo(field.type)) {
190
+ .array => try buffer.writer().print(" {s}: Buffer\n", .{
191
+ field.name,
192
+ }),
193
+ else => try buffer.writer().print(
194
+ " {s}: {s}\n",
195
+ .{
196
+ field.name,
197
+ typescript_type(field.type),
198
+ },
199
+ ),
200
+ }
201
+ }
202
+
203
+ try buffer.writer().print("}}\n\n", .{});
204
+ }
205
+
206
+ fn emit_docs(
207
+ buffer: anytype,
208
+ comptime mapping: TypeMapping,
209
+ comptime indent: comptime_int,
210
+ comptime field: ?[]const u8,
211
+ ) !void {
212
+ if (mapping.docs_link) |docs_link| {
213
+ try buffer.writer().print(
214
+ \\
215
+ \\{[indent]s}/**
216
+ \\{[indent]s}* See [{[name]s}](https://docs.tigerbeetle.com/{[docs_link]s}{[field]s})
217
+ \\{[indent]s}*/
218
+ \\
219
+ , .{
220
+ .indent = " " ** indent,
221
+ .name = field orelse mapping.name,
222
+ .docs_link = docs_link,
223
+ .field = field orelse "",
224
+ });
225
+ }
226
+ }
227
+
228
+ pub fn generate_bindings(buffer: *std.ArrayList(u8)) !void {
229
+ @setEvalBranchQuota(100_000);
230
+
231
+ try buffer.writer().print(
232
+ \\///////////////////////////////////////////////////////
233
+ \\// This file was auto-generated by node_bindings.zig //
234
+ \\// Do not manually modify. //
235
+ \\///////////////////////////////////////////////////////
236
+ \\
237
+ \\
238
+ , .{});
239
+
240
+ // Emit JS declarations.
241
+ inline for (type_mappings) |type_mapping| {
242
+ const ZigType = type_mapping[0];
243
+ const mapping = type_mapping[1];
244
+
245
+ switch (@typeInfo(ZigType)) {
246
+ .@"struct" => |info| switch (info.layout) {
247
+ .auto => @compileError(
248
+ "Only packed or extern structs are supported: " ++ @typeName(ZigType),
249
+ ),
250
+ .@"packed" => try emit_packed_struct(buffer, info, mapping),
251
+ .@"extern" => try emit_struct(buffer, info, mapping),
252
+ },
253
+ .@"enum" => try emit_enum(buffer, ZigType, mapping),
254
+ else => @compileError("Type cannot be represented: " ++ @typeName(ZigType)),
255
+ }
256
+ }
257
+ }
258
+
259
+ pub fn main() !void {
260
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
261
+ defer arena.deinit();
262
+ const allocator = arena.allocator();
263
+
264
+ var buffer = std.ArrayList(u8).init(allocator);
265
+ try generate_bindings(&buffer);
266
+ try std.io.getStdOut().writeAll(buffer.items);
267
+ }
@@ -0,0 +1,3 @@
1
+ pub const c = @cImport({
2
+ @cInclude("node_api.h");
3
+ });
@@ -0,0 +1,379 @@
1
+ const std = @import("std");
2
+ const assert = std.debug.assert;
3
+ const c = @import("c.zig").c;
4
+
5
+ pub fn register_function(
6
+ env: c.napi_env,
7
+ exports: c.napi_value,
8
+ comptime name: [:0]const u8,
9
+ function: *const fn (env: c.napi_env, info: c.napi_callback_info) callconv(.c) c.napi_value,
10
+ ) !void {
11
+ var napi_function: c.napi_value = undefined;
12
+ if (c.napi_create_function(env, null, 0, function, null, &napi_function) != c.napi_ok) {
13
+ return throw(env, "Failed to create function " ++ name ++ "().");
14
+ }
15
+
16
+ if (c.napi_set_named_property(
17
+ env,
18
+ exports,
19
+ @as([*c]const u8, @ptrCast(name)),
20
+ napi_function,
21
+ ) != c.napi_ok) {
22
+ return throw(env, "Failed to add " ++ name ++ "() to exports.");
23
+ }
24
+ }
25
+
26
+ const TranslationError = error{ExceptionThrown};
27
+ pub fn throw(env: c.napi_env, comptime message: [:0]const u8) TranslationError {
28
+ const result = c.napi_throw_error(env, null, @as([*c]const u8, @ptrCast(message)));
29
+ switch (result) {
30
+ c.napi_ok, c.napi_pending_exception => {},
31
+ else => unreachable,
32
+ }
33
+
34
+ return TranslationError.ExceptionThrown;
35
+ }
36
+
37
+ pub fn capture_null(env: c.napi_env) !c.napi_value {
38
+ var result: c.napi_value = undefined;
39
+ if (c.napi_get_null(env, &result) != c.napi_ok) {
40
+ return throw(env, "Failed to capture the value of \"null\".");
41
+ }
42
+
43
+ return result;
44
+ }
45
+
46
+ pub fn extract_args(env: c.napi_env, info: c.napi_callback_info, comptime args: struct {
47
+ count: usize,
48
+ function: []const u8,
49
+ }) ![args.count]c.napi_value {
50
+ var argc = args.count;
51
+ var argv: [args.count]c.napi_value = undefined;
52
+ if (c.napi_get_cb_info(env, info, &argc, &argv, null, null) != c.napi_ok) {
53
+ return throw(
54
+ env,
55
+ std.fmt.comptimePrint("Failed to get args for {s}()\x00", .{args.function}),
56
+ );
57
+ }
58
+
59
+ if (argc != args.count) {
60
+ return throw(
61
+ env,
62
+ std.fmt.comptimePrint("Function {s}() requires exactly {} arguments.\x00", .{
63
+ args.function,
64
+ args.count,
65
+ }),
66
+ );
67
+ }
68
+
69
+ return argv;
70
+ }
71
+
72
+ pub fn create_external(env: c.napi_env, context: *anyopaque) !c.napi_value {
73
+ var result: c.napi_value = null;
74
+ if (c.napi_create_external(env, context, null, null, &result) != c.napi_ok) {
75
+ return throw(env, "Failed to create external for client context.");
76
+ }
77
+
78
+ return result;
79
+ }
80
+
81
+ pub fn value_external(
82
+ env: c.napi_env,
83
+ value: c.napi_value,
84
+ comptime error_message: [:0]const u8,
85
+ ) !?*anyopaque {
86
+ var result: ?*anyopaque = undefined;
87
+ if (c.napi_get_value_external(env, value, &result) != c.napi_ok) {
88
+ return throw(env, error_message);
89
+ }
90
+
91
+ return result;
92
+ }
93
+
94
+ pub fn slice_from_object(
95
+ env: c.napi_env,
96
+ object: c.napi_value,
97
+ comptime key: [:0]const u8,
98
+ ) ![]const u8 {
99
+ var property: c.napi_value = undefined;
100
+ if (c.napi_get_named_property(env, object, key, &property) != c.napi_ok) {
101
+ return throw(env, key ++ " must be defined");
102
+ }
103
+
104
+ return slice_from_value(env, property, key);
105
+ }
106
+
107
+ pub fn slice_from_value(
108
+ env: c.napi_env,
109
+ value: c.napi_value,
110
+ comptime key: [:0]const u8,
111
+ ) ![]u8 {
112
+ var is_buffer: bool = undefined;
113
+ assert(c.napi_is_buffer(env, value, &is_buffer) == c.napi_ok);
114
+
115
+ if (!is_buffer) return throw(env, key ++ " must be a buffer");
116
+
117
+ var data: ?*anyopaque = null;
118
+ var data_length: usize = undefined;
119
+ assert(c.napi_get_buffer_info(env, value, &data, &data_length) == c.napi_ok);
120
+
121
+ if (data_length < 1) return throw(env, key ++ " must not be empty");
122
+
123
+ return @as([*]u8, @ptrCast(data.?))[0..data_length];
124
+ }
125
+
126
+ pub fn u128_from_object(env: c.napi_env, object: c.napi_value, comptime key: [:0]const u8) !u128 {
127
+ var property: c.napi_value = undefined;
128
+ if (c.napi_get_named_property(env, object, key, &property) != c.napi_ok) {
129
+ return throw(env, key ++ " must be defined");
130
+ }
131
+
132
+ return u128_from_value(env, property, key);
133
+ }
134
+
135
+ pub fn u64_from_object(env: c.napi_env, object: c.napi_value, comptime key: [:0]const u8) !u64 {
136
+ var property: c.napi_value = undefined;
137
+ if (c.napi_get_named_property(env, object, key, &property) != c.napi_ok) {
138
+ return throw(env, key ++ " must be defined");
139
+ }
140
+
141
+ return u64_from_value(env, property, key);
142
+ }
143
+
144
+ pub fn u32_from_object(env: c.napi_env, object: c.napi_value, comptime key: [:0]const u8) !u32 {
145
+ var property: c.napi_value = undefined;
146
+ if (c.napi_get_named_property(env, object, key, &property) != c.napi_ok) {
147
+ return throw(env, key ++ " must be defined");
148
+ }
149
+
150
+ return u32_from_value(env, property, key);
151
+ }
152
+
153
+ pub fn u16_from_object(env: c.napi_env, object: c.napi_value, comptime key: [:0]const u8) !u16 {
154
+ const result = try u32_from_object(env, object, key);
155
+ if (result > std.math.maxInt(u16)) {
156
+ return throw(env, key ++ " must be a u16.");
157
+ }
158
+
159
+ return @as(u16, @intCast(result));
160
+ }
161
+
162
+ pub fn u128_from_value(env: c.napi_env, value: c.napi_value, comptime name: [:0]const u8) !u128 {
163
+ // A BigInt's value (using ^ to mean exponent) is
164
+ // (words[0] * (2^64)^0 + words[1] * (2^64)^1 + ...).
165
+
166
+ // V8 says that the words are little endian. If we were on a big endian machine
167
+ // we would need to convert, but big endian is not supported by tigerbeetle.
168
+ var result: u128 = 0;
169
+ var sign_bit: c_int = undefined;
170
+ const words: *[2]u64 = @ptrCast(&result);
171
+ var word_count: usize = 2;
172
+ switch (c.napi_get_value_bigint_words(env, value, &sign_bit, &word_count, words)) {
173
+ c.napi_ok => {},
174
+ c.napi_bigint_expected => return throw(env, name ++ " must be a BigInt"),
175
+ else => unreachable,
176
+ }
177
+ if (sign_bit != 0) return throw(env, name ++ " must be positive");
178
+ if (word_count > 2) return throw(env, name ++ " must fit in 128 bits");
179
+
180
+ return result;
181
+ }
182
+
183
+ pub fn u64_from_value(env: c.napi_env, value: c.napi_value, comptime name: [:0]const u8) !u64 {
184
+ var result: u64 = undefined;
185
+ var lossless: bool = undefined;
186
+ switch (c.napi_get_value_bigint_uint64(env, value, &result, &lossless)) {
187
+ c.napi_ok => {},
188
+ c.napi_bigint_expected => return throw(env, name ++ " must be an unsigned 64-bit BigInt"),
189
+ else => unreachable,
190
+ }
191
+ if (!lossless) return throw(env, name ++ " conversion was lossy");
192
+
193
+ return result;
194
+ }
195
+
196
+ pub fn u32_from_value(env: c.napi_env, value: c.napi_value, comptime name: [:0]const u8) !u32 {
197
+ var result: u32 = undefined;
198
+ // TODO Check whether this will coerce signed numbers to a u32:
199
+ // In that case we need to use the appropriate napi method to do more type checking here.
200
+ // We want to make sure this is: unsigned, and an integer.
201
+ switch (c.napi_get_value_uint32(env, value, &result)) {
202
+ c.napi_ok => {},
203
+ c.napi_number_expected => return throw(env, name ++ " must be a number"),
204
+ else => unreachable,
205
+ }
206
+ return result;
207
+ }
208
+
209
+ pub fn u128_into_object(
210
+ env: c.napi_env,
211
+ object: c.napi_value,
212
+ comptime key: [:0]const u8,
213
+ value: u128,
214
+ comptime error_message: [:0]const u8,
215
+ ) !void {
216
+ // A BigInt's value (using ^ to mean exponent) is
217
+ // (words[0] * (2^64)^0 + words[1] * (2^64)^1 + ...).
218
+
219
+ // V8 says that the words are little endian. If we were on a big endian machine
220
+ // we would need to convert, but big endian is not supported by tigerbeetle.
221
+ var bigint: c.napi_value = undefined;
222
+ if (c.napi_create_bigint_words(
223
+ env,
224
+ 0,
225
+ 2,
226
+ @as(*const [2]u64, @ptrCast(&value)),
227
+ &bigint,
228
+ ) != c.napi_ok) {
229
+ return throw(env, error_message);
230
+ }
231
+
232
+ if (c.napi_set_named_property(
233
+ env,
234
+ object,
235
+ @ptrCast(key),
236
+ bigint,
237
+ ) != c.napi_ok) {
238
+ return throw(env, error_message);
239
+ }
240
+ }
241
+
242
+ pub fn u64_into_object(
243
+ env: c.napi_env,
244
+ object: c.napi_value,
245
+ comptime key: [:0]const u8,
246
+ value: u64,
247
+ comptime error_message: [:0]const u8,
248
+ ) !void {
249
+ var result: c.napi_value = undefined;
250
+ if (c.napi_create_bigint_uint64(env, value, &result) != c.napi_ok) {
251
+ return throw(env, error_message);
252
+ }
253
+
254
+ if (c.napi_set_named_property(
255
+ env,
256
+ object,
257
+ @ptrCast(key),
258
+ result,
259
+ ) != c.napi_ok) {
260
+ return throw(env, error_message);
261
+ }
262
+ }
263
+
264
+ pub fn u32_into_object(
265
+ env: c.napi_env,
266
+ object: c.napi_value,
267
+ comptime key: [:0]const u8,
268
+ value: u32,
269
+ comptime error_message: [:0]const u8,
270
+ ) !void {
271
+ var result: c.napi_value = undefined;
272
+ if (c.napi_create_uint32(env, value, &result) != c.napi_ok) {
273
+ return throw(env, error_message);
274
+ }
275
+
276
+ if (c.napi_set_named_property(env, object, @ptrCast(key), result) != c.napi_ok) {
277
+ return throw(env, error_message);
278
+ }
279
+ }
280
+
281
+ pub fn u16_into_object(
282
+ env: c.napi_env,
283
+ object: c.napi_value,
284
+ comptime key: [:0]const u8,
285
+ value: u16,
286
+ comptime error_message: [:0]const u8,
287
+ ) !void {
288
+ try u32_into_object(env, object, key, value, error_message);
289
+ }
290
+
291
+ pub fn create_object(env: c.napi_env, comptime error_message: [:0]const u8) !c.napi_value {
292
+ var result: c.napi_value = undefined;
293
+ if (c.napi_create_object(env, &result) != c.napi_ok) {
294
+ return throw(env, error_message);
295
+ }
296
+
297
+ return result;
298
+ }
299
+
300
+ pub fn create_array(
301
+ env: c.napi_env,
302
+ length: u32,
303
+ comptime error_message: [:0]const u8,
304
+ ) !c.napi_value {
305
+ var result: c.napi_value = undefined;
306
+ if (c.napi_create_array_with_length(env, length, &result) != c.napi_ok) {
307
+ return throw(env, error_message);
308
+ }
309
+
310
+ return result;
311
+ }
312
+
313
+ pub fn set_array_element(
314
+ env: c.napi_env,
315
+ array: c.napi_value,
316
+ index: u32,
317
+ value: c.napi_value,
318
+ comptime error_message: [:0]const u8,
319
+ ) !void {
320
+ if (c.napi_set_element(env, array, index, value) != c.napi_ok) {
321
+ return throw(env, error_message);
322
+ }
323
+ }
324
+
325
+ pub fn array_element(env: c.napi_env, array: c.napi_value, index: u32) !c.napi_value {
326
+ var element: c.napi_value = undefined;
327
+ if (c.napi_get_element(env, array, index, &element) != c.napi_ok) {
328
+ return throw(env, "Failed to get array element.");
329
+ }
330
+
331
+ return element;
332
+ }
333
+
334
+ pub fn array_length(env: c.napi_env, array: c.napi_value) !u32 {
335
+ var is_array: bool = undefined;
336
+ assert(c.napi_is_array(env, array, &is_array) == c.napi_ok);
337
+ if (!is_array) return throw(env, "Batch must be an Array.");
338
+
339
+ var length: u32 = undefined;
340
+ assert(c.napi_get_array_length(env, array, &length) == c.napi_ok);
341
+
342
+ return length;
343
+ }
344
+
345
+ pub fn delete_reference(env: c.napi_env, reference: c.napi_ref) !void {
346
+ if (c.napi_delete_reference(env, reference) != c.napi_ok) {
347
+ return throw(env, "Failed to delete callback reference.");
348
+ }
349
+ }
350
+
351
+ pub fn call_function(
352
+ env: c.napi_env,
353
+ this: c.napi_value,
354
+ callback: c.napi_value,
355
+ args: []c.napi_value,
356
+ ) !c.napi_value {
357
+ var result: c.napi_value = undefined;
358
+ switch (c.napi_call_function(env, this, callback, args.len, args.ptr, &result)) {
359
+ c.napi_ok => {},
360
+ // the user's callback may throw a JS exception or call other functions that do so. We
361
+ // therefore don't throw another error.
362
+ c.napi_pending_exception => {},
363
+ else => return throw(env, "Failed to invoke results callback."),
364
+ }
365
+ return result;
366
+ }
367
+
368
+ pub fn reference_value(
369
+ env: c.napi_env,
370
+ callback_reference: c.napi_ref,
371
+ comptime error_message: [:0]const u8,
372
+ ) !c.napi_value {
373
+ var result: c.napi_value = undefined;
374
+ if (c.napi_get_reference_value(env, callback_reference, &result) != c.napi_ok) {
375
+ return throw(env, error_message);
376
+ }
377
+
378
+ return result;
379
+ }