tigerbeetle 0.0.40 → 0.17.8

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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -25
  3. data/README.md +670 -80
  4. data/docs/migration.md +201 -0
  5. data/sig/tigerbeetle.rbs +271 -0
  6. data/src/ext/tigerbeetle/extconf.rb +47 -0
  7. data/src/ext/tigerbeetle/lib/aarch64-linux-gnu.2.27/libtb_client.so +0 -0
  8. data/src/ext/tigerbeetle/lib/aarch64-linux-musl/libtb_client.so +0 -0
  9. data/src/ext/tigerbeetle/lib/aarch64-macos/libtb_client.dylib +0 -0
  10. data/src/ext/tigerbeetle/lib/x86_64-linux-gnu.2.27/libtb_client.so +0 -0
  11. data/src/ext/tigerbeetle/lib/x86_64-linux-musl/libtb_client.so +0 -0
  12. data/src/ext/tigerbeetle/lib/x86_64-macos/libtb_client.dylib +0 -0
  13. data/src/ext/tigerbeetle/lib/x86_64-windows/tb_client.dll +0 -0
  14. data/src/ext/tigerbeetle/rb_tb_gen.h +458 -0
  15. data/{ext/tb_client/tigerbeetle/src/clients/rust/assets → src/ext/tigerbeetle}/tb_client.h +18 -16
  16. data/src/ext/tigerbeetle/tigerbeetle.c +310 -0
  17. data/src/tigerbeetle/bindings.rb +347 -0
  18. data/src/tigerbeetle/client.rb +129 -0
  19. data/src/tigerbeetle/completion_dispatcher.rb +108 -0
  20. data/src/tigerbeetle/id.rb +40 -0
  21. data/src/tigerbeetle/tb.rb +3 -0
  22. data/src/tigerbeetle/version.rb +3 -0
  23. data/src/tigerbeetle.rb +39 -0
  24. metadata +33 -350
  25. data/CHANGELOG.md +0 -162
  26. data/ext/tb_client/extconf.rb +0 -41
  27. data/ext/tb_client/tigerbeetle/LICENSE +0 -177
  28. data/ext/tb_client/tigerbeetle/build.zig +0 -2296
  29. data/ext/tb_client/tigerbeetle/src/aof.zig +0 -1000
  30. data/ext/tb_client/tigerbeetle/src/build/fetch.zig +0 -112
  31. data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +0 -808
  32. data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +0 -1283
  33. data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +0 -1704
  34. data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +0 -341
  35. data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +0 -1450
  36. data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +0 -1659
  37. data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +0 -406
  38. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +0 -1092
  39. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +0 -286
  40. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +0 -158
  41. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +0 -229
  42. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +0 -110
  43. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +0 -386
  44. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +0 -34
  45. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +0 -281
  46. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +0 -312
  47. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +0 -138
  48. data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +0 -466
  49. data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +0 -157
  50. data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +0 -90
  51. data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +0 -203
  52. data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +0 -79
  53. data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +0 -542
  54. data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +0 -109
  55. data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +0 -86
  56. data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +0 -370
  57. data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +0 -386
  58. data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +0 -167
  59. data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +0 -126
  60. data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +0 -996
  61. data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +0 -748
  62. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +0 -3238
  63. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +0 -1718
  64. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +0 -190
  65. data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +0 -104
  66. data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +0 -75
  67. data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +0 -522
  68. data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +0 -267
  69. data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +0 -3
  70. data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +0 -379
  71. data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +0 -131
  72. data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +0 -63
  73. data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +0 -588
  74. data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +0 -73
  75. data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +0 -106
  76. data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +0 -305
  77. data/ext/tb_client/tigerbeetle/src/config.zig +0 -296
  78. data/ext/tb_client/tigerbeetle/src/constants.zig +0 -790
  79. data/ext/tb_client/tigerbeetle/src/copyhound.zig +0 -202
  80. data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +0 -72
  81. data/ext/tb_client/tigerbeetle/src/direction.zig +0 -120
  82. data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +0 -158
  83. data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +0 -156
  84. data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +0 -252
  85. data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +0 -313
  86. data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +0 -87
  87. data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +0 -63
  88. data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +0 -47
  89. data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +0 -28
  90. data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +0 -61
  91. data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +0 -169
  92. data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +0 -46
  93. data/ext/tb_client/tigerbeetle/src/ewah.zig +0 -445
  94. data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +0 -128
  95. data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +0 -171
  96. data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +0 -179
  97. data/ext/tb_client/tigerbeetle/src/integration_tests.zig +0 -662
  98. data/ext/tb_client/tigerbeetle/src/io/common.zig +0 -155
  99. data/ext/tb_client/tigerbeetle/src/io/darwin.zig +0 -1093
  100. data/ext/tb_client/tigerbeetle/src/io/linux.zig +0 -1880
  101. data/ext/tb_client/tigerbeetle/src/io/test.zig +0 -1005
  102. data/ext/tb_client/tigerbeetle/src/io/windows.zig +0 -1598
  103. data/ext/tb_client/tigerbeetle/src/io.zig +0 -34
  104. data/ext/tb_client/tigerbeetle/src/iops.zig +0 -134
  105. data/ext/tb_client/tigerbeetle/src/list.zig +0 -236
  106. data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +0 -848
  107. data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +0 -179
  108. data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +0 -424
  109. data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +0 -420
  110. data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +0 -2114
  111. data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +0 -185
  112. data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +0 -1146
  113. data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +0 -1102
  114. data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +0 -200
  115. data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +0 -1495
  116. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +0 -739
  117. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +0 -166
  118. data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +0 -754
  119. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +0 -1294
  120. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +0 -510
  121. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +0 -1241
  122. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -628
  123. data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +0 -247
  124. data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +0 -116
  125. data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +0 -543
  126. data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +0 -938
  127. data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +0 -293
  128. data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +0 -359
  129. data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +0 -99
  130. data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +0 -17
  131. data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +0 -962
  132. data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +0 -617
  133. data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +0 -84
  134. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +0 -1500
  135. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -149
  136. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -7
  137. data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +0 -865
  138. data/ext/tb_client/tigerbeetle/src/lsm/table.zig +0 -607
  139. data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +0 -843
  140. data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +0 -90
  141. data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +0 -40
  142. data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +0 -629
  143. data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +0 -933
  144. data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +0 -534
  145. data/ext/tb_client/tigerbeetle/src/message_buffer.zig +0 -469
  146. data/ext/tb_client/tigerbeetle/src/message_bus.zig +0 -1219
  147. data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +0 -936
  148. data/ext/tb_client/tigerbeetle/src/message_pool.zig +0 -343
  149. data/ext/tb_client/tigerbeetle/src/multiversion.zig +0 -2195
  150. data/ext/tb_client/tigerbeetle/src/queue.zig +0 -390
  151. data/ext/tb_client/tigerbeetle/src/repl/completion.zig +0 -201
  152. data/ext/tb_client/tigerbeetle/src/repl/parser.zig +0 -1356
  153. data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +0 -496
  154. data/ext/tb_client/tigerbeetle/src/repl.zig +0 -1034
  155. data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +0 -973
  156. data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +0 -1866
  157. data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +0 -304
  158. data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +0 -227
  159. data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +0 -658
  160. data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +0 -466
  161. data/ext/tb_client/tigerbeetle/src/scripts/release.zig +0 -1058
  162. data/ext/tb_client/tigerbeetle/src/scripts.zig +0 -105
  163. data/ext/tb_client/tigerbeetle/src/shell.zig +0 -1195
  164. data/ext/tb_client/tigerbeetle/src/stack.zig +0 -260
  165. data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +0 -911
  166. data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +0 -2079
  167. data/ext/tb_client/tigerbeetle/src/state_machine.zig +0 -4872
  168. data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +0 -288
  169. data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +0 -3128
  170. data/ext/tb_client/tigerbeetle/src/static_allocator.zig +0 -82
  171. data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +0 -157
  172. data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +0 -292
  173. data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +0 -65
  174. data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +0 -1414
  175. data/ext/tb_client/tigerbeetle/src/stdx/huge_page_allocator.zig +0 -115
  176. data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +0 -92
  177. data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +0 -677
  178. data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +0 -336
  179. data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +0 -511
  180. data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +0 -112
  181. data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +0 -1163
  182. data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +0 -142
  183. data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +0 -361
  184. data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +0 -275
  185. data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +0 -295
  186. data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +0 -436
  187. data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +0 -48
  188. data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +0 -402
  189. data/ext/tb_client/tigerbeetle/src/storage.zig +0 -489
  190. data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +0 -180
  191. data/ext/tb_client/tigerbeetle/src/testing/bench.zig +0 -146
  192. data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +0 -53
  193. data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +0 -61
  194. data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +0 -76
  195. data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +0 -110
  196. data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +0 -412
  197. data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +0 -331
  198. data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -458
  199. data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +0 -1198
  200. data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +0 -128
  201. data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +0 -181
  202. data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +0 -144
  203. data/ext/tb_client/tigerbeetle/src/testing/id.zig +0 -97
  204. data/ext/tb_client/tigerbeetle/src/testing/io.zig +0 -317
  205. data/ext/tb_client/tigerbeetle/src/testing/marks.zig +0 -126
  206. data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +0 -533
  207. data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +0 -154
  208. data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +0 -389
  209. data/ext/tb_client/tigerbeetle/src/testing/storage.zig +0 -1247
  210. data/ext/tb_client/tigerbeetle/src/testing/table.zig +0 -249
  211. data/ext/tb_client/tigerbeetle/src/testing/time.zig +0 -98
  212. data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +0 -212
  213. data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +0 -26
  214. data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +0 -579
  215. data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +0 -39
  216. data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +0 -214
  217. data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +0 -34
  218. data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +0 -785
  219. data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +0 -543
  220. data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +0 -181
  221. data/ext/tb_client/tigerbeetle/src/tidy.zig +0 -1449
  222. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +0 -227
  223. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +0 -1069
  224. data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +0 -1422
  225. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +0 -1658
  226. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +0 -518
  227. data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +0 -36
  228. data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +0 -646
  229. data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +0 -958
  230. data/ext/tb_client/tigerbeetle/src/time.zig +0 -236
  231. data/ext/tb_client/tigerbeetle/src/trace/event.zig +0 -745
  232. data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +0 -462
  233. data/ext/tb_client/tigerbeetle/src/trace.zig +0 -556
  234. data/ext/tb_client/tigerbeetle/src/unit_tests.zig +0 -321
  235. data/ext/tb_client/tigerbeetle/src/vopr.zig +0 -1785
  236. data/ext/tb_client/tigerbeetle/src/vortex.zig +0 -101
  237. data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +0 -473
  238. data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +0 -208
  239. data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +0 -43
  240. data/ext/tb_client/tigerbeetle/src/vsr/client.zig +0 -768
  241. data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +0 -532
  242. data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +0 -338
  243. data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +0 -1019
  244. data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +0 -279
  245. data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +0 -1381
  246. data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +0 -315
  247. data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +0 -1460
  248. data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +0 -757
  249. data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +0 -797
  250. data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +0 -2586
  251. data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +0 -308
  252. data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +0 -1777
  253. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +0 -715
  254. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +0 -185
  255. data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +0 -333
  256. data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +0 -12356
  257. data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +0 -416
  258. data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +0 -165
  259. data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +0 -2928
  260. data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +0 -1075
  261. data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +0 -1603
  262. data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -484
  263. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +0 -405
  264. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -355
  265. data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +0 -29
  266. data/ext/tb_client/tigerbeetle/src/vsr.zig +0 -1727
  267. data/lib/tb_client/shared_lib.rb +0 -66
  268. data/lib/tb_client.rb +0 -282
  269. data/lib/tigerbeetle/account.rb +0 -38
  270. data/lib/tigerbeetle/account_balance.rb +0 -23
  271. data/lib/tigerbeetle/account_filter.rb +0 -31
  272. data/lib/tigerbeetle/atomic_counter.rb +0 -14
  273. data/lib/tigerbeetle/client.rb +0 -214
  274. data/lib/tigerbeetle/converters/account.rb +0 -63
  275. data/lib/tigerbeetle/converters/account_balance.rb +0 -31
  276. data/lib/tigerbeetle/converters/account_filter.rb +0 -32
  277. data/lib/tigerbeetle/converters/base.rb +0 -35
  278. data/lib/tigerbeetle/converters/create_accounts_result.rb +0 -21
  279. data/lib/tigerbeetle/converters/create_transfers_result.rb +0 -21
  280. data/lib/tigerbeetle/converters/query_filter.rb +0 -33
  281. data/lib/tigerbeetle/converters/time.rb +0 -23
  282. data/lib/tigerbeetle/converters/transfer.rb +0 -64
  283. data/lib/tigerbeetle/converters/uint_128.rb +0 -24
  284. data/lib/tigerbeetle/converters.rb +0 -12
  285. data/lib/tigerbeetle/error.rb +0 -4
  286. data/lib/tigerbeetle/id.rb +0 -30
  287. data/lib/tigerbeetle/platforms.rb +0 -9
  288. data/lib/tigerbeetle/query_filter.rb +0 -31
  289. data/lib/tigerbeetle/request.rb +0 -7
  290. data/lib/tigerbeetle/transfer.rb +0 -40
  291. data/lib/tigerbeetle/version.rb +0 -4
  292. data/lib/tigerbeetle.rb +0 -13
  293. data/tigerbeetle.gemspec +0 -60
data/README.md CHANGED
@@ -1,130 +1,720 @@
1
- # Ruby Client for TigerBeetle
1
+ <!-- This file is generated by [/src/scripts/client_readmes.zig](/src/scripts/client_readmes.zig). -->
2
+ # tigerbeetle
2
3
 
3
- [![Gem](https://badge.fury.io/rb/tigerbeetle.svg)](https://rubygems.org/gems/tigerbeetle)
4
- [![CI](https://github.com/antstorm/tigerbeetle-ruby/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/antstorm/tigerbeetle-ruby/actions/workflows/ci.yml)
5
- [![License](https://img.shields.io/github/license/antstorm/tigerbeetle-ruby.svg)](https://opensource.org/licenses/apache-2-0)
4
+ The TigerBeetle client for Ruby.
6
5
 
7
- Are you looking to integrate [Tigebeetle](https://tigerbeetle.com/) into your Ruby (or Rails) stack?
8
- You've come to the right place!
6
+ >[!IMPORTANT]
7
+ >This gem changed ownership from [Anthony D](https://github.com/antstorm)
8
+ to TigerBeetle. If you're upgrading from a 0.0.x version, please consult
9
+ the [migration guide](./docs/migration.md) for the necessary code changes.
9
10
 
10
- TigerBeetle is a high performance financial transaction database (i.e. Ledger) designed to power
11
- the next 30 years of Online Transaction Processing. And this is a feature complete Ruby client for
12
- it that leverages [the native Zig client](https://tigerbeetle.com/blog/2023-02-21-writing-high-performance-clients-for-tigerbeetle/).
11
+ ## Prerequisites
13
12
 
13
+ Linux >= 5.6 is the only production environment we
14
+ support. But for ease of development we also support macOS and Windows.
15
+ * Ruby >= `3.3`
14
16
 
15
- ## Usage
17
+ ## Setup
16
18
 
17
- Start by adding the TigerBeetle gem to your Gemfile:
19
+ First, create a directory for your project and `cd` into the directory.
20
+
21
+ Then, install the TigerBeetle client:
22
+
23
+ ```console
24
+ gem install tigerbeetle
25
+ ```
26
+
27
+ Now, create `main.rb` and copy this into it:
18
28
 
19
29
  ```ruby
20
- gem 'tigerbeetle'
30
+ require "tigerbeetle"
31
+
32
+ puts("Import OK!")
21
33
  ```
22
34
 
23
- Ensure TigerBeetle is running ([more on this](https://docs.tigerbeetle.com/start/)):
35
+ Finally, build and run:
36
+
37
+ ```console
38
+ ruby main.rb
39
+ ```
40
+
41
+ Now that all prerequisites and dependencies are correctly set
42
+ up, let's dig into using TigerBeetle.
43
+
44
+ ## Sample projects
45
+
46
+ This document is primarily a reference guide to
47
+ the client. Below are various sample projects demonstrating
48
+ features of TigerBeetle.
49
+
50
+ * [Basic](/src/clients/ruby/samples/basic/): Create two accounts and transfer an amount between them.
51
+ * [Two-Phase Transfer](/src/clients/ruby/samples/two-phase/): Create two accounts and start a pending transfer between
52
+ them, then post the transfer.
53
+ * [Many Two-Phase Transfers](/src/clients/ruby/samples/two-phase-many/): Create two accounts and start a number of pending transfers
54
+ between them, posting and voiding alternating transfers.
24
55
 
25
- ```bash
26
- $ curl -Lo tigerbeetle.zip https://linux.tigerbeetle.com && unzip tigerbeetle.zip && ./tigerbeetle version
27
- $ ./tigerbeetle format --cluster=0 --replica=0 --replica-count=1 --development 0_0.tigerbeetle
28
- $ ./tigerbeetle start --addresses=3000 --development 0_0.tigerbeetle
56
+ ## Creating a Client
57
+
58
+ A client is created with a cluster ID and replica
59
+ addresses for all replicas in the cluster. The cluster
60
+ ID and replica addresses are both chosen by the system that
61
+ starts the TigerBeetle cluster.
62
+
63
+ Clients are thread-safe and a single instance should be shared
64
+ between multiple concurrent tasks. This allows events to be
65
+ [automatically batched](https://docs.tigerbeetle.com/coding/requests/#batching-events).
66
+
67
+ Multiple clients are useful when connecting to more than
68
+ one TigerBeetle cluster.
69
+
70
+ In this example the cluster ID is `0` and there is one
71
+ replica. The address is read from the `TB_ADDRESS`
72
+ environment variable and defaults to port `3000`.
73
+
74
+ ```ruby
75
+ replica_addresses = ENV.fetch("TB_ADDRESS", "3000")
76
+
77
+ TigerBeetle::Client.open(cluster_id: 0, replica_addresses:) do |client|
78
+ # Use the client.
79
+ end
29
80
  ```
30
81
 
31
- Connect your Ruby client and start using it:
82
+ The gem also provides an optional top-level alias.
83
+ Require `tigerbeetle/tb` to use `TB` as a shorthand for `TigerBeetle`:
32
84
 
33
85
  ```ruby
34
- client = TigerBeetle.connect # using default cluster_id (0) and address (127.0.0.1:3000)
86
+ require "tigerbeetle/tb"
87
+
88
+ account = TB::Account.new(id: TB.id, ledger: 1, code: 1)
89
+ ```
90
+
91
+ The alias is opt-in and is not defined by `require "tigerbeetle"`.
92
+
93
+ The `TigerBeetle::Client` is fiber-scheduler aware, so it works with e.g.
94
+ the `async` gem without requiring code changes.
95
+
96
+ ```ruby
97
+ require "async"
98
+ require "async/semaphore"
99
+ require "tigerbeetle"
100
+
101
+ semaphore = Async::Semaphore.new(16)
102
+
103
+ account_batches = Array.new(16) do
104
+ Array.new(1_000) do
105
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1)
106
+ end
107
+ end
108
+
109
+ TigerBeetle::Client.open(cluster_id: 0, replica_addresses: "3000") do |client|
110
+ Async do
111
+ account_batches
112
+ .map { |batch| semaphore.async { client.create_accounts(batch) } }
113
+ .each(&:wait)
114
+ end
115
+ end
116
+ ```
117
+
118
+ The following are valid addresses:
119
+ * `3000` (interpreted as `127.0.0.1:3000`)
120
+ * `127.0.0.1:3000` (interpreted as `127.0.0.1:3000`)
121
+ * `127.0.0.1` (interpreted as `127.0.0.1:3001`, `3001` is the default port)
122
+
123
+ ## Creating Accounts
124
+
125
+ See details for account fields in the [Accounts
126
+ reference](https://docs.tigerbeetle.com/reference/account).
127
+
128
+ ```ruby
129
+ account = TigerBeetle::Account.new(
130
+ id: TigerBeetle.id,
131
+ debits_pending: 0,
132
+ debits_posted: 0,
133
+ credits_pending: 0,
134
+ credits_posted: 0,
135
+ user_data_128: 0,
136
+ user_data_64: 0,
137
+ user_data_32: 0,
138
+ ledger: 1,
139
+ code: 718,
140
+ flags: TigerBeetle::AccountFlags::NONE,
141
+ timestamp: 0
142
+ )
143
+
144
+ account_results = client.create_accounts([account])
145
+ # Results handling omitted.
146
+ ```
147
+
148
+ See details for the recommended ID scheme in
149
+ [time-based identifiers](https://docs.tigerbeetle.com/coding/data-modeling#tigerbeetle-time-based-identifiers-recommended).
150
+
151
+ ### Account Flags
152
+
153
+ The account flags value is a bitfield. See details for
154
+ these flags in the [Accounts
155
+ reference](https://docs.tigerbeetle.com/reference/account#flags).
156
+
157
+ To toggle behavior for an account, combine constants from the
158
+ `TigerBeetle::AccountFlags` module with bitwise-or:
35
159
 
36
- # create accounts
37
- client.create_accounts(
38
- TigerBeetle::Account.new(id: 100, ledger: 1, code: 1),
39
- TigerBeetle::Account.new(id: 101, ledger: 1, code: 1)
160
+ * `AccountFlags::LINKED`
161
+ * `AccountFlags::DEBITS_MUST_NOT_EXCEED_CREDITS`
162
+ * `AccountFlags::CREDITS_MUST_NOT_EXCEED_DEBITS`
163
+ * `AccountFlags::HISTORY`
164
+
165
+
166
+ For example, to link two accounts where the first account
167
+ additionally has the `debits_must_not_exceed_credits` constraint:
168
+
169
+ ```ruby
170
+ account0 = TigerBeetle::Account.new(
171
+ id: TigerBeetle.id,
172
+ ledger: 1,
173
+ code: 1,
174
+ flags: TigerBeetle::AccountFlags::LINKED |
175
+ TigerBeetle::AccountFlags::DEBITS_MUST_NOT_EXCEED_CREDITS
176
+ )
177
+ account1 = TigerBeetle::Account.new(
178
+ id: TigerBeetle.id,
179
+ ledger: 1,
180
+ code: 1,
181
+ flags: TigerBeetle::AccountFlags::HISTORY
40
182
  )
41
183
 
42
- # move funds between accounts
43
- client.create_transfers(
184
+ account_results = client.create_accounts([account0, account1])
185
+ # Results handling omitted.
186
+ ```
187
+
188
+ ### Response and Errors
189
+
190
+ The response is an array containing the _status code_ and the _timestamp_ of
191
+ each account in the request batch:
192
+ - Successfully created accounts with the status
193
+ [`created`](https://docs.tigerbeetle.com/reference/requests/create_accounts#created)
194
+ return the timestamp assigned to the `Account` object.
195
+ - Already existing accounts with the result
196
+ [`exists`](https://docs.tigerbeetle.com/reference/requests/create_accounts#exists)
197
+ return the timestamp of the original existing object.
198
+ - Failed accounts return the status code along with the timestamp when the validation
199
+ occurred. See all error conditions in the
200
+ [create_accounts reference](https://docs.tigerbeetle.com/reference/requests/create_accounts#status).
201
+
202
+ ```ruby
203
+ accounts = [
204
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1),
205
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1),
206
+ TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1)
207
+ ]
208
+
209
+ account_results = client.create_accounts(accounts)
210
+ account_results.each_with_index do |result, index|
211
+ case result.status
212
+ when TigerBeetle::CreateAccountStatus::CREATED
213
+ puts("Batch account at #{index} successfully created with timestamp #{result.timestamp}.")
214
+ when TigerBeetle::CreateAccountStatus::EXISTS
215
+ puts("Batch account at #{index} already exists with timestamp #{result.timestamp}.")
216
+ else
217
+ puts("Batch account at #{index} failed to create: #{result.status}.")
218
+ end
219
+ end
220
+ ```
221
+
222
+ To handle errors you can compare the result status returned
223
+ from `client.create_accounts` with constants in the
224
+ `TigerBeetle::CreateAccountStatus` module.
225
+
226
+ ## Account Lookup
227
+
228
+ Account lookup is batched, like account creation. Pass
229
+ in all IDs to fetch. The account for each matched ID is returned.
230
+
231
+ If no account matches an ID, no object is returned for
232
+ that account. So the order of accounts in the response is
233
+ not necessarily the same as the order of IDs in the
234
+ request. You can refer to the ID field in the response to
235
+ distinguish accounts.
236
+
237
+ ```ruby
238
+ accounts = client.lookup_accounts([account0.id, account1.id])
239
+ ```
240
+
241
+ ## Create Transfers
242
+
243
+ This creates a journal entry between two accounts.
244
+
245
+ See details for transfer fields in the [Transfers
246
+ reference](https://docs.tigerbeetle.com/reference/transfer).
247
+
248
+ ```ruby
249
+ transfers = [
44
250
  TigerBeetle::Transfer.new(
45
- id: 100,
46
- debit_account_id: 100,
47
- credit_account_id: 101,
48
- amount: 999,
251
+ id: TigerBeetle.id,
252
+ debit_account_id: transfer_debit_account_id,
253
+ credit_account_id: transfer_credit_account_id,
254
+ amount: 10,
255
+ pending_id: 0,
256
+ user_data_128: 0,
257
+ user_data_64: 0,
258
+ user_data_32: 0,
259
+ timeout: 0,
49
260
  ledger: 1,
50
- code: 10
261
+ code: 720,
262
+ flags: TigerBeetle::TransferFlags::NONE,
263
+ timestamp: 0
51
264
  )
265
+ ]
266
+
267
+ transfer_results = client.create_transfers(transfers)
268
+ # Results handling omitted.
269
+ ```
270
+
271
+ See details for the recommended ID scheme in
272
+ [time-based identifiers](https://docs.tigerbeetle.com/coding/data-modeling#tigerbeetle-time-based-identifiers-recommended).
273
+
274
+ ### Response and Errors
275
+
276
+ The response is an array containing the _status code_ and the _timestamp_ of
277
+ each transfer in the request batch:
278
+ - Successfully created transfers with the result
279
+ [`created`](https://docs.tigerbeetle.com/reference/requests/create_transfers#created)
280
+ return the timestamp assigned to the `Transfer` object.
281
+ - Already existing transfers with the result
282
+ [`exists`](https://docs.tigerbeetle.com/reference/requests/create_transfers#exists)
283
+ return the timestamp of the original existing object.
284
+ - Failed transfers return the status code along with the timestamp when the validation
285
+ occurred. See all error conditions in the
286
+ [create_transfers reference](https://docs.tigerbeetle.com/reference/requests/create_transfers#status).
287
+
288
+ ```ruby
289
+ batch = [
290
+ TigerBeetle::Transfer.new(
291
+ id: TigerBeetle.id,
292
+ debit_account_id: transfer_debit_account_id,
293
+ credit_account_id: transfer_credit_account_id,
294
+ amount: 10,
295
+ ledger: 1,
296
+ code: 720
297
+ ),
298
+ TigerBeetle::Transfer.new(
299
+ id: TigerBeetle.id,
300
+ debit_account_id: transfer_debit_account_id,
301
+ credit_account_id: transfer_credit_account_id,
302
+ amount: 10,
303
+ ledger: 1,
304
+ code: 720
305
+ ),
306
+ TigerBeetle::Transfer.new(
307
+ id: TigerBeetle.id,
308
+ debit_account_id: transfer_debit_account_id,
309
+ credit_account_id: transfer_credit_account_id,
310
+ amount: 10,
311
+ ledger: 1,
312
+ code: 720
313
+ )
314
+ ]
315
+
316
+ transfer_results = client.create_transfers(batch)
317
+ transfer_results.each_with_index do |result, index|
318
+ case result.status
319
+ when TigerBeetle::CreateTransferStatus::CREATED
320
+ puts("Batch transfer at #{index} successfully created with timestamp #{result.timestamp}.")
321
+ when TigerBeetle::CreateTransferStatus::EXISTS
322
+ puts("Batch transfer at #{index} already exists with timestamp #{result.timestamp}.")
323
+ else
324
+ puts("Batch transfer at #{index} failed to create: #{result.status}.")
325
+ end
326
+ end
327
+ ```
328
+
329
+ To handle errors you can compare the result status returned
330
+ from `client.create_transfers` with constants in the
331
+ `TigerBeetle::CreateTransferStatus` module.
332
+
333
+ ## Batching
334
+
335
+ TigerBeetle performance is maximized when you batch
336
+ API requests.
337
+
338
+ A client instance shared across multiple threads/tasks can automatically
339
+ batch concurrent requests, but the application must still send as many events
340
+ as possible in a single call.
341
+
342
+ For example, if you insert 1 million transfers sequentially, one at a time,
343
+ the insert rate will be a *fraction* of the potential, because the client will
344
+ wait for a reply between each one.
345
+ Instead, **always batch as much as you can**.
346
+
347
+ The maximum batch size is set in the TigerBeetle server. The default is 8189.
348
+
349
+ ```ruby
350
+ # Array of transfers to create.
351
+ batch = []
352
+ batch.each_slice(8189) do |slice|
353
+ transfer_results = client.create_transfers(slice)
354
+ # Results handling omitted.
355
+ end
356
+ ```
357
+
358
+ ### Queues and Workers
359
+
360
+ If you are making requests to TigerBeetle from workers
361
+ pulling jobs from a queue, you can batch requests to
362
+ TigerBeetle by having the worker act on multiple jobs from
363
+ the queue at once rather than one at a time. i.e. pulling
364
+ multiple jobs from the queue rather than just one.
365
+
366
+ ## Transfer Flags
367
+
368
+ The transfer `flags` value is a bitfield. See details for these flags in
369
+ the [Transfers
370
+ reference](https://docs.tigerbeetle.com/reference/transfer#flags).
371
+
372
+ To toggle behavior for a transfer, combine constants from the
373
+ `TigerBeetle::TransferFlags` module with bitwise-or:
374
+
375
+ * `TransferFlags::LINKED`
376
+ * `TransferFlags::PENDING`
377
+ * `TransferFlags::POST_PENDING_TRANSFER`
378
+ * `TransferFlags::VOID_PENDING_TRANSFER`
379
+
380
+ For example, to link `transfer0` and `transfer1`:
381
+
382
+ ```ruby
383
+ transfer0 = TigerBeetle::Transfer.new(
384
+ id: TigerBeetle.id,
385
+ debit_account_id: transfer_debit_account_id,
386
+ credit_account_id: transfer_credit_account_id,
387
+ amount: 10,
388
+ ledger: 1,
389
+ code: 720,
390
+ flags: TigerBeetle::TransferFlags::LINKED
391
+ )
392
+ transfer1 = TigerBeetle::Transfer.new(
393
+ id: TigerBeetle.id,
394
+ debit_account_id: transfer_debit_account_id,
395
+ credit_account_id: transfer_credit_account_id,
396
+ amount: 10,
397
+ ledger: 1,
398
+ code: 720
52
399
  )
53
400
 
54
- # check balances
55
- account_1, account_2 = client.lookup_accounts(100, 101)
56
- account_1.debits_posted # 999
57
- account_2.credits_posted # 999
401
+ transfer_results = client.create_transfers([transfer0, transfer1])
402
+ # Results handling omitted.
58
403
  ```
59
404
 
60
- *More information on the `ledger` and `code` attributes can be found
61
- [here](https://docs.tigerbeetle.com/coding/data-modeling/).*
405
+ ### Two-Phase Transfers
62
406
 
63
- ### Connecting to a cluster
407
+ Two-phase transfers are supported natively by toggling the appropriate
408
+ flag. TigerBeetle will then adjust the `credits_pending` and
409
+ `debits_pending` fields of the appropriate accounts. A corresponding
410
+ post pending transfer then needs to be sent to post or void the
411
+ transfer.
64
412
 
65
- When connecting to a TigerBeetle cluster (multiple replicas) you need to specify all the replica
66
- addresses ordered and separated by a comma, e.g. `127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002`.
413
+ #### Post a Pending Transfer
67
414
 
68
- *NOTE: Currently TigerBeetle does not support domain names, only IPv4 addresses.*
415
+ With `flags` set to `post_pending_transfer`,
416
+ TigerBeetle will post the transfer. TigerBeetle will atomically roll
417
+ back the changes to `debits_pending` and `credits_pending` of the
418
+ appropriate accounts and apply them to the `debits_posted` and
419
+ `credits_posted` balances.
69
420
 
70
- ## IDs
421
+ ```ruby
422
+ pending_transfer = TigerBeetle::Transfer.new(
423
+ id: TigerBeetle.id,
424
+ debit_account_id: transfer_debit_account_id,
425
+ credit_account_id: transfer_credit_account_id,
426
+ amount: 10,
427
+ ledger: 1,
428
+ code: 720,
429
+ flags: TigerBeetle::TransferFlags::PENDING
430
+ )
71
431
 
72
- You can choose whatever IDs you want when creating accounts and transfers (as long as they are
73
- unique per cluster). However to leverage the maximum performance TigerBeetle recommends using
74
- strictly increasing decentralized 128-bit IDs. To generate such an ID you can use the provided
75
- `TigerBeetle.id` method.
432
+ transfer_results = client.create_transfers([pending_transfer])
433
+ # Results handling omitted.
434
+
435
+ post_transfer = TigerBeetle::Transfer.new(
436
+ id: TigerBeetle.id,
437
+ debit_account_id: transfer_debit_account_id,
438
+ credit_account_id: transfer_credit_account_id,
439
+ amount: 10,
440
+ pending_id: pending_transfer.id,
441
+ ledger: 1,
442
+ code: 720,
443
+ flags: TigerBeetle::TransferFlags::POST_PENDING_TRANSFER
444
+ )
445
+
446
+ transfer_results = client.create_transfers([post_transfer])
447
+ # Results handling omitted.
448
+ ```
449
+
450
+ #### Void a Pending Transfer
451
+
452
+ In contrast, with `flags` set to `void_pending_transfer`,
453
+ TigerBeetle will void the transfer. TigerBeetle will roll
454
+ back the changes to `debits_pending` and `credits_pending` of the
455
+ appropriate accounts and **not** apply them to the `debits_posted` and
456
+ `credits_posted` balances.
76
457
 
77
458
  ```ruby
78
- client.create_accounts(
79
- TigerBeetle::Account.new(id: TigerBeetle.id, ledger: 1, code: 1)
459
+ pending_transfer = TigerBeetle::Transfer.new(
460
+ id: TigerBeetle.id,
461
+ debit_account_id: transfer_debit_account_id,
462
+ credit_account_id: transfer_credit_account_id,
463
+ amount: 10,
464
+ ledger: 1,
465
+ code: 720,
466
+ flags: TigerBeetle::TransferFlags::PENDING
467
+ )
468
+
469
+ transfer_results = client.create_transfers([pending_transfer])
470
+ # Results handling omitted.
471
+
472
+ void_transfer = TigerBeetle::Transfer.new(
473
+ id: TigerBeetle.id,
474
+ debit_account_id: transfer_debit_account_id,
475
+ credit_account_id: transfer_credit_account_id,
476
+ amount: 0,
477
+ pending_id: pending_transfer.id,
478
+ ledger: 1,
479
+ code: 720,
480
+ flags: TigerBeetle::TransferFlags::VOID_PENDING_TRANSFER
80
481
  )
482
+
483
+ transfer_results = client.create_transfers([void_transfer])
484
+ # Results handling omitted.
81
485
  ```
82
486
 
83
- *More on how to approach this — https://docs.tigerbeetle.com/coding/data-modeling/#id.*
487
+ ## Transfer Lookup
84
488
 
489
+ NOTE: While transfer lookup exists, it is not a flexible query API. We
490
+ are developing query APIs and there will be new methods for querying
491
+ transfers in the future.
85
492
 
86
- ## Async
493
+ Transfer lookup is batched, like transfer creation. Pass in all `id`s to
494
+ fetch, and matched transfers are returned.
87
495
 
88
- All the lower level calls executed by the client are non-blocking. However, since async calls are
89
- much less common in Ruby, these are made blocking by default. In order to use the client
90
- asynchronously all you need to do is provide your own callback to any method on the client:
496
+ If no transfer matches an `id`, no object is returned for that
497
+ transfer. So the order of transfers in the response is not necessarily
498
+ the same as the order of `id`s in the request. You can refer to the
499
+ `id` field in the response to distinguish transfers.
91
500
 
92
501
  ```ruby
93
- # default blocking call
94
- result = client.lookup_accounts(100)
95
- result # [#<struct TigerBeetle::Account id=100, ... >]
502
+ transfers = client.lookup_transfers([transfer0.id, transfer1.id])
503
+ ```
96
504
 
97
- # async non-blocking call
98
- client.lookup_accounts(100) do |result|
99
- result # [#<struct TigerBeetle::Account id=100, ... >]
100
- end
505
+ ## Get Account Transfers
506
+
507
+ NOTE: This is a preview API that is subject to breaking changes once we have
508
+ a stable querying API.
509
+
510
+ Fetches the transfers involving a given account, allowing basic filter and pagination
511
+ capabilities.
512
+
513
+ The transfers in the response are sorted by `timestamp` in chronological or
514
+ reverse-chronological order.
515
+
516
+ ```ruby
517
+ filter = TigerBeetle::AccountFilter.new(
518
+ account_id: account1.id,
519
+ user_data_128: 0,
520
+ user_data_64: 0,
521
+ user_data_32: 0,
522
+ code: 0,
523
+ timestamp_min: 0,
524
+ timestamp_max: 0,
525
+ limit: 10,
526
+ flags: TigerBeetle::AccountFilterFlags::DEBITS |
527
+ TigerBeetle::AccountFilterFlags::CREDITS |
528
+ TigerBeetle::AccountFilterFlags::REVERSED
529
+ )
530
+
531
+ account_transfers = client.get_account_transfers(filter)
101
532
  ```
102
533
 
103
- *In the example above the first call will block until TigerBeetle responds and the return value of
104
- the call will contain the result. The second call however will return `nil` straight away (and keep
105
- executing your code) while calling the provided block only once TigerBeetle has responded, passing
106
- in the result as an argument to the block.*
534
+ ## Get Account Balances
107
535
 
536
+ NOTE: This is a preview API that is subject to breaking changes once we have
537
+ a stable querying API.
108
538
 
109
- ## Contributing
539
+ Fetches the point-in-time balances of a given account, allowing basic filter and
540
+ pagination capabilities.
110
541
 
111
- We'd love your help building the TigerBeetle Ruby gem.
542
+ Only accounts created with the flag
543
+ [`history`](https://docs.tigerbeetle.com/reference/account#flagshistory) set retain
544
+ [historical balances](https://docs.tigerbeetle.com/reference/requests/get_account_balances).
112
545
 
113
- - Join the [official Slack](https://slack.tigerbeetle.com/join) for general questions on TigerBeetle
114
- - For any discovered problems or questions about the Ruby client — [open a new issue](https://github.com/antstorm/tigerbeetle-ruby/issues/new)
115
- - For codebase improvements:
116
- - Fork this repo
117
- - Unpack the native ext with `bundle exec rake compile`
118
- - Implement your changes
119
- - Ensure the tests pass by running `bundle exec rspec`
120
- - Open a new pull request
121
- - If you're making changes to the native code, you might need to build TigerBeetle C client
122
- - Pull in the TigerBeetle submodule with `git submodule update --init --recursive --remote`
123
- - Install Zig `cd ext/tb_client/tigerbeetle && zig/download.sh`
124
- - Add `zig` to your PATH `export PATH=$PATH:<PATH-TO-THIS-REPO>/ext/tb_client/tigerbeetle/zig`
125
- - Compile the client `bundle exec rake clean compile`
546
+ The balances in the response are sorted by `timestamp` in chronological or
547
+ reverse-chronological order.
548
+
549
+ ```ruby
550
+ filter = TigerBeetle::AccountFilter.new(
551
+ account_id: account1.id,
552
+ user_data_128: 0,
553
+ user_data_64: 0,
554
+ user_data_32: 0,
555
+ code: 0,
556
+ timestamp_min: 0,
557
+ timestamp_max: 0,
558
+ limit: 10,
559
+ flags: TigerBeetle::AccountFilterFlags::DEBITS |
560
+ TigerBeetle::AccountFilterFlags::CREDITS |
561
+ TigerBeetle::AccountFilterFlags::REVERSED
562
+ )
563
+
564
+ account_balances = client.get_account_balances(filter)
565
+ ```
126
566
 
567
+ ## Query Accounts
568
+
569
+ NOTE: This is a preview API that is subject to breaking changes once we have
570
+ a stable querying API.
571
+
572
+ Query accounts by the intersection of some fields and by timestamp range.
573
+
574
+ The accounts in the response are sorted by `timestamp` in chronological or
575
+ reverse-chronological order.
576
+
577
+ ```ruby
578
+ query_filter = TigerBeetle::QueryFilter.new(
579
+ user_data_128: 0,
580
+ user_data_64: 0,
581
+ user_data_32: 0,
582
+ ledger: 1,
583
+ code: 1,
584
+ timestamp_min: 0,
585
+ timestamp_max: 0,
586
+ limit: 10,
587
+ flags: TigerBeetle::QueryFilterFlags::REVERSED
588
+ )
589
+
590
+ query_accounts = client.query_accounts(query_filter)
591
+ ```
592
+
593
+ ## Query Transfers
594
+
595
+ NOTE: This is a preview API that is subject to breaking changes once we have
596
+ a stable querying API.
597
+
598
+ Query transfers by the intersection of some fields and by timestamp range.
599
+
600
+ The transfers in the response are sorted by `timestamp` in chronological or
601
+ reverse-chronological order.
602
+
603
+ ```ruby
604
+ query_filter = TigerBeetle::QueryFilter.new(
605
+ user_data_128: 0,
606
+ user_data_64: 0,
607
+ user_data_32: 0,
608
+ ledger: 1,
609
+ code: 720,
610
+ timestamp_min: 0,
611
+ timestamp_max: 0,
612
+ limit: 10,
613
+ flags: TigerBeetle::QueryFilterFlags::REVERSED
614
+ )
615
+
616
+ query_transfers = client.query_transfers(query_filter)
617
+ ```
618
+
619
+ ## Linked Events
620
+
621
+ When the `linked` flag is specified for an account when creating accounts or
622
+ a transfer when creating transfers, it links that event with the next event in the
623
+ batch, to create a chain of events, of arbitrary length, which all
624
+ succeed or fail together. The tail of a chain is denoted by the first
625
+ event without this flag. The last event in a batch may therefore never
626
+ have the `linked` flag set as this would leave a chain
627
+ open-ended. Multiple chains or individual events may coexist within a
628
+ batch to succeed or fail independently.
629
+
630
+ Events within a chain are executed within order, or are rolled back on
631
+ error, so that the effect of each event in the chain is visible to the
632
+ next, and so that the chain is either visible or invisible as a unit
633
+ to subsequent events after the chain. The event that was the first to
634
+ break the chain will have a unique error result. Other events in the
635
+ chain will have their error result set to `linked_event_failed`.
636
+
637
+ ```ruby
638
+ linked_flag = TigerBeetle::TransferFlags::LINKED
639
+ batch = [
640
+ TigerBeetle::Transfer.new(
641
+ id: TigerBeetle.id,
642
+ debit_account_id: transfer_debit_account_id,
643
+ credit_account_id: transfer_credit_account_id,
644
+ amount: 1,
645
+ ledger: 1,
646
+ code: 720,
647
+ flags: linked_flag
648
+ ),
649
+ TigerBeetle::Transfer.new(
650
+ id: TigerBeetle.id,
651
+ debit_account_id: transfer_debit_account_id,
652
+ credit_account_id: transfer_credit_account_id,
653
+ amount: 1,
654
+ ledger: 1,
655
+ code: 720
656
+ )
657
+ ]
658
+
659
+ transfer_results = client.create_transfers(batch)
660
+ # Results handling omitted.
661
+ ```
662
+
663
+ ## Imported Events
664
+
665
+ When the `imported` flag is specified for an account when creating accounts or
666
+ a transfer when creating transfers, it allows importing historical events with
667
+ a user-defined timestamp.
668
+
669
+ The entire batch of events must be set with the flag `imported`.
670
+
671
+ It's recommended to submit the whole batch as a `linked` chain of events, ensuring that
672
+ if any event fails, none of them are committed, preserving the last timestamp unchanged.
673
+ This approach gives the application a chance to correct failed imported events, re-submitting
674
+ the batch again with the same user-defined timestamps.
675
+
676
+ ```ruby
677
+ historical_timestamp = 0
678
+ # Loaded from an external source.
679
+ historical_accounts = []
680
+ # Loaded from an external source.
681
+ historical_transfers = []
682
+
683
+ accounts_to_import = historical_accounts.map.with_index do |historical_account, index|
684
+ historical_timestamp += 1
685
+ historical_account.timestamp = historical_timestamp
686
+ historical_account.flags = TigerBeetle::AccountFlags::IMPORTED
687
+ if index < historical_accounts.length - 1
688
+ historical_account.flags |= TigerBeetle::AccountFlags::LINKED
689
+ end
690
+
691
+ historical_account
692
+ end
693
+
694
+ account_results = client.create_accounts(accounts_to_import)
695
+ # Results handling omitted.
696
+
697
+ transfers_to_import = historical_transfers.map.with_index do |historical_transfer, index|
698
+ historical_timestamp += 1
699
+ historical_transfer.timestamp = historical_timestamp
700
+ historical_transfer.flags = TigerBeetle::TransferFlags::IMPORTED
701
+ if index < historical_transfers.length - 1
702
+ historical_transfer.flags |= TigerBeetle::TransferFlags::LINKED
703
+ end
704
+
705
+ historical_transfer
706
+ end
707
+
708
+ transfer_results = client.create_transfers(transfers_to_import)
709
+ # Results handling omitted.
710
+ ```
127
711
 
128
- ## License
712
+ ## Timeouts And Cancellation
129
713
 
130
- This project is licensed under [Apache 2.0 license](https://github.com/temporalio/temporal/blob/main/LICENSE).
714
+ The Client retries indefinitely and doesn't impose any per-request timeout. Cancellation is
715
+ provided as a mechanism, and the specific cancellation policy is left to the
716
+ application. A Client instance can be closed at any time. On close, all in-flight
717
+ requests are canceled and return an error to the caller. Even if an error is returned,
718
+ a request might still be processed by the TigerBeetle server.
719
+ [Reliable transaction submission](https://docs.tigerbeetle.com/coding/reliable-transaction-submission/)
720
+ explains how to make transfers retry-proof using IDs for end-to-end idempotency.