tigerbeetle-node 0.10.0 → 0.11.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 (92) hide show
  1. package/README.md +302 -101
  2. package/dist/index.d.ts +70 -72
  3. package/dist/index.js +70 -72
  4. package/dist/index.js.map +1 -1
  5. package/package.json +6 -6
  6. package/scripts/download_node_headers.sh +14 -7
  7. package/src/index.ts +6 -10
  8. package/src/node.zig +6 -3
  9. package/src/tigerbeetle/scripts/benchmark.sh +4 -4
  10. package/src/tigerbeetle/scripts/confirm_image.sh +44 -0
  11. package/src/tigerbeetle/scripts/fuzz_loop.sh +15 -0
  12. package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +7 -0
  13. package/src/tigerbeetle/scripts/install.sh +19 -4
  14. package/src/tigerbeetle/scripts/install_zig.bat +5 -1
  15. package/src/tigerbeetle/scripts/install_zig.sh +24 -14
  16. package/src/tigerbeetle/scripts/pre-commit.sh +9 -0
  17. package/src/tigerbeetle/scripts/shellcheck.sh +5 -0
  18. package/src/tigerbeetle/scripts/tests_on_alpine.sh +10 -0
  19. package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +14 -0
  20. package/src/tigerbeetle/src/benchmark.zig +4 -2
  21. package/src/tigerbeetle/src/benchmark_array_search.zig +3 -3
  22. package/src/tigerbeetle/src/c/tb_client/thread.zig +8 -9
  23. package/src/tigerbeetle/src/c/tb_client.h +100 -80
  24. package/src/tigerbeetle/src/c/tb_client.zig +4 -1
  25. package/src/tigerbeetle/src/cli.zig +1 -1
  26. package/src/tigerbeetle/src/config.zig +48 -16
  27. package/src/tigerbeetle/src/demo.zig +3 -1
  28. package/src/tigerbeetle/src/eytzinger_benchmark.zig +3 -3
  29. package/src/tigerbeetle/src/io/linux.zig +1 -1
  30. package/src/tigerbeetle/src/lsm/README.md +214 -0
  31. package/src/tigerbeetle/src/lsm/binary_search.zig +137 -10
  32. package/src/tigerbeetle/src/lsm/bloom_filter.zig +43 -0
  33. package/src/tigerbeetle/src/lsm/compaction.zig +352 -398
  34. package/src/tigerbeetle/src/lsm/composite_key.zig +2 -0
  35. package/src/tigerbeetle/src/lsm/eytzinger.zig +1 -1
  36. package/src/tigerbeetle/src/lsm/forest.zig +21 -447
  37. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +412 -0
  38. package/src/tigerbeetle/src/lsm/grid.zig +145 -69
  39. package/src/tigerbeetle/src/lsm/groove.zig +196 -133
  40. package/src/tigerbeetle/src/lsm/k_way_merge.zig +40 -18
  41. package/src/tigerbeetle/src/lsm/level_iterator.zig +28 -9
  42. package/src/tigerbeetle/src/lsm/manifest.zig +81 -181
  43. package/src/tigerbeetle/src/lsm/manifest_level.zig +210 -454
  44. package/src/tigerbeetle/src/lsm/manifest_log.zig +77 -28
  45. package/src/tigerbeetle/src/lsm/posted_groove.zig +64 -76
  46. package/src/tigerbeetle/src/lsm/segmented_array.zig +561 -241
  47. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +148 -0
  48. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +9 -0
  49. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +62 -12
  50. package/src/tigerbeetle/src/lsm/table.zig +83 -48
  51. package/src/tigerbeetle/src/lsm/table_immutable.zig +30 -23
  52. package/src/tigerbeetle/src/lsm/table_iterator.zig +25 -14
  53. package/src/tigerbeetle/src/lsm/table_mutable.zig +63 -12
  54. package/src/tigerbeetle/src/lsm/test.zig +49 -55
  55. package/src/tigerbeetle/src/lsm/tree.zig +407 -402
  56. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +457 -0
  57. package/src/tigerbeetle/src/main.zig +28 -6
  58. package/src/tigerbeetle/src/message_bus.zig +2 -2
  59. package/src/tigerbeetle/src/message_pool.zig +14 -17
  60. package/src/tigerbeetle/src/simulator.zig +145 -112
  61. package/src/tigerbeetle/src/state_machine.zig +338 -228
  62. package/src/tigerbeetle/src/static_allocator.zig +65 -0
  63. package/src/tigerbeetle/src/storage.zig +3 -7
  64. package/src/tigerbeetle/src/test/accounting/auditor.zig +577 -0
  65. package/src/tigerbeetle/src/test/accounting/workload.zig +819 -0
  66. package/src/tigerbeetle/src/test/cluster.zig +18 -48
  67. package/src/tigerbeetle/src/test/conductor.zig +365 -0
  68. package/src/tigerbeetle/src/test/fuzz.zig +121 -0
  69. package/src/tigerbeetle/src/test/id.zig +89 -0
  70. package/src/tigerbeetle/src/test/priority_queue.zig +645 -0
  71. package/src/tigerbeetle/src/test/state_checker.zig +93 -69
  72. package/src/tigerbeetle/src/test/state_machine.zig +11 -35
  73. package/src/tigerbeetle/src/test/storage.zig +29 -8
  74. package/src/tigerbeetle/src/tigerbeetle.zig +14 -16
  75. package/src/tigerbeetle/src/unit_tests.zig +7 -0
  76. package/src/tigerbeetle/src/vopr.zig +494 -0
  77. package/src/tigerbeetle/src/vopr_hub/README.md +58 -0
  78. package/src/tigerbeetle/src/vopr_hub/SETUP.md +199 -0
  79. package/src/tigerbeetle/src/vopr_hub/go.mod +3 -0
  80. package/src/tigerbeetle/src/vopr_hub/main.go +1022 -0
  81. package/src/tigerbeetle/src/vopr_hub/scheduler/go.mod +3 -0
  82. package/src/tigerbeetle/src/vopr_hub/scheduler/main.go +403 -0
  83. package/src/tigerbeetle/src/vsr/client.zig +13 -0
  84. package/src/tigerbeetle/src/vsr/journal.zig +16 -13
  85. package/src/tigerbeetle/src/vsr/replica.zig +924 -491
  86. package/src/tigerbeetle/src/vsr/superblock.zig +55 -37
  87. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +7 -10
  88. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +2 -2
  89. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +18 -3
  90. package/src/tigerbeetle/src/vsr.zig +75 -55
  91. package/src/tigerbeetle/scripts/vopr.bat +0 -48
  92. package/src/tigerbeetle/scripts/vopr.sh +0 -33
package/dist/index.js CHANGED
@@ -11,26 +11,23 @@ var AccountFlags;
11
11
  var CreateAccountError;
12
12
  (function (CreateAccountError) {
13
13
  CreateAccountError[CreateAccountError["linked_event_failed"] = 1] = "linked_event_failed";
14
- CreateAccountError[CreateAccountError["reserved_flag"] = 2] = "reserved_flag";
15
- CreateAccountError[CreateAccountError["reserved_field"] = 3] = "reserved_field";
16
- CreateAccountError[CreateAccountError["id_must_not_be_zero"] = 4] = "id_must_not_be_zero";
17
- CreateAccountError[CreateAccountError["id_must_not_be_int_max"] = 5] = "id_must_not_be_int_max";
18
- CreateAccountError[CreateAccountError["ledger_must_not_be_zero"] = 6] = "ledger_must_not_be_zero";
19
- CreateAccountError[CreateAccountError["code_must_not_be_zero"] = 7] = "code_must_not_be_zero";
20
- CreateAccountError[CreateAccountError["mutually_exclusive_flags"] = 8] = "mutually_exclusive_flags";
21
- CreateAccountError[CreateAccountError["overflows_debits"] = 9] = "overflows_debits";
22
- CreateAccountError[CreateAccountError["overflows_credits"] = 10] = "overflows_credits";
23
- CreateAccountError[CreateAccountError["exceeds_credits"] = 11] = "exceeds_credits";
24
- CreateAccountError[CreateAccountError["exceeds_debits"] = 12] = "exceeds_debits";
25
- CreateAccountError[CreateAccountError["exists_with_different_flags"] = 13] = "exists_with_different_flags";
26
- CreateAccountError[CreateAccountError["exists_with_different_user_data"] = 14] = "exists_with_different_user_data";
27
- CreateAccountError[CreateAccountError["exists_with_different_ledger"] = 15] = "exists_with_different_ledger";
28
- CreateAccountError[CreateAccountError["exists_with_different_code"] = 16] = "exists_with_different_code";
29
- CreateAccountError[CreateAccountError["exists_with_different_debits_pending"] = 17] = "exists_with_different_debits_pending";
30
- CreateAccountError[CreateAccountError["exists_with_different_debits_posted"] = 18] = "exists_with_different_debits_posted";
31
- CreateAccountError[CreateAccountError["exists_with_different_credits_pending"] = 19] = "exists_with_different_credits_pending";
32
- CreateAccountError[CreateAccountError["exists_with_different_credits_posted"] = 20] = "exists_with_different_credits_posted";
33
- CreateAccountError[CreateAccountError["exists"] = 21] = "exists";
14
+ CreateAccountError[CreateAccountError["linked_event_chain_open"] = 2] = "linked_event_chain_open";
15
+ CreateAccountError[CreateAccountError["reserved_flag"] = 3] = "reserved_flag";
16
+ CreateAccountError[CreateAccountError["reserved_field"] = 4] = "reserved_field";
17
+ CreateAccountError[CreateAccountError["id_must_not_be_zero"] = 5] = "id_must_not_be_zero";
18
+ CreateAccountError[CreateAccountError["id_must_not_be_int_max"] = 6] = "id_must_not_be_int_max";
19
+ CreateAccountError[CreateAccountError["ledger_must_not_be_zero"] = 7] = "ledger_must_not_be_zero";
20
+ CreateAccountError[CreateAccountError["code_must_not_be_zero"] = 8] = "code_must_not_be_zero";
21
+ CreateAccountError[CreateAccountError["debits_pending_must_be_zero"] = 9] = "debits_pending_must_be_zero";
22
+ CreateAccountError[CreateAccountError["debits_posted_must_be_zero"] = 10] = "debits_posted_must_be_zero";
23
+ CreateAccountError[CreateAccountError["credits_pending_must_be_zero"] = 11] = "credits_pending_must_be_zero";
24
+ CreateAccountError[CreateAccountError["credits_posted_must_be_zero"] = 12] = "credits_posted_must_be_zero";
25
+ CreateAccountError[CreateAccountError["mutually_exclusive_flags"] = 13] = "mutually_exclusive_flags";
26
+ CreateAccountError[CreateAccountError["exists_with_different_flags"] = 14] = "exists_with_different_flags";
27
+ CreateAccountError[CreateAccountError["exists_with_different_user_data"] = 15] = "exists_with_different_user_data";
28
+ CreateAccountError[CreateAccountError["exists_with_different_ledger"] = 16] = "exists_with_different_ledger";
29
+ CreateAccountError[CreateAccountError["exists_with_different_code"] = 17] = "exists_with_different_code";
30
+ CreateAccountError[CreateAccountError["exists"] = 18] = "exists";
34
31
  })(CreateAccountError = exports.CreateAccountError || (exports.CreateAccountError = {}));
35
32
  var TransferFlags;
36
33
  (function (TransferFlags) {
@@ -42,58 +39,59 @@ var TransferFlags;
42
39
  var CreateTransferError;
43
40
  (function (CreateTransferError) {
44
41
  CreateTransferError[CreateTransferError["linked_event_failed"] = 1] = "linked_event_failed";
45
- CreateTransferError[CreateTransferError["reserved_flag"] = 2] = "reserved_flag";
46
- CreateTransferError[CreateTransferError["reserved_field"] = 3] = "reserved_field";
47
- CreateTransferError[CreateTransferError["id_must_not_be_zero"] = 4] = "id_must_not_be_zero";
48
- CreateTransferError[CreateTransferError["id_must_not_be_int_max"] = 5] = "id_must_not_be_int_max";
49
- CreateTransferError[CreateTransferError["debit_account_id_must_not_be_zero"] = 6] = "debit_account_id_must_not_be_zero";
50
- CreateTransferError[CreateTransferError["debit_account_id_must_not_be_int_max"] = 7] = "debit_account_id_must_not_be_int_max";
51
- CreateTransferError[CreateTransferError["credit_account_id_must_not_be_zero"] = 8] = "credit_account_id_must_not_be_zero";
52
- CreateTransferError[CreateTransferError["credit_account_id_must_not_be_int_max"] = 9] = "credit_account_id_must_not_be_int_max";
53
- CreateTransferError[CreateTransferError["accounts_must_be_different"] = 10] = "accounts_must_be_different";
54
- CreateTransferError[CreateTransferError["pending_id_must_be_zero"] = 11] = "pending_id_must_be_zero";
55
- CreateTransferError[CreateTransferError["pending_transfer_must_timeout"] = 12] = "pending_transfer_must_timeout";
56
- CreateTransferError[CreateTransferError["ledger_must_not_be_zero"] = 13] = "ledger_must_not_be_zero";
57
- CreateTransferError[CreateTransferError["code_must_not_be_zero"] = 14] = "code_must_not_be_zero";
58
- CreateTransferError[CreateTransferError["amount_must_not_be_zero"] = 15] = "amount_must_not_be_zero";
59
- CreateTransferError[CreateTransferError["debit_account_not_found"] = 16] = "debit_account_not_found";
60
- CreateTransferError[CreateTransferError["credit_account_not_found"] = 17] = "credit_account_not_found";
61
- CreateTransferError[CreateTransferError["accounts_must_have_the_same_ledger"] = 18] = "accounts_must_have_the_same_ledger";
62
- CreateTransferError[CreateTransferError["transfer_must_have_the_same_ledger_as_accounts"] = 19] = "transfer_must_have_the_same_ledger_as_accounts";
63
- CreateTransferError[CreateTransferError["exists_with_different_flags"] = 20] = "exists_with_different_flags";
64
- CreateTransferError[CreateTransferError["exists_with_different_debit_account_id"] = 21] = "exists_with_different_debit_account_id";
65
- CreateTransferError[CreateTransferError["exists_with_different_credit_account_id"] = 22] = "exists_with_different_credit_account_id";
66
- CreateTransferError[CreateTransferError["exists_with_different_user_data"] = 23] = "exists_with_different_user_data";
67
- CreateTransferError[CreateTransferError["exists_with_different_pending_id"] = 24] = "exists_with_different_pending_id";
68
- CreateTransferError[CreateTransferError["exists_with_different_timeout"] = 25] = "exists_with_different_timeout";
69
- CreateTransferError[CreateTransferError["exists_with_different_code"] = 26] = "exists_with_different_code";
70
- CreateTransferError[CreateTransferError["exists_with_different_amount"] = 27] = "exists_with_different_amount";
71
- CreateTransferError[CreateTransferError["exists"] = 28] = "exists";
72
- CreateTransferError[CreateTransferError["overflows_debits_pending"] = 29] = "overflows_debits_pending";
73
- CreateTransferError[CreateTransferError["overflows_credits_pending"] = 30] = "overflows_credits_pending";
74
- CreateTransferError[CreateTransferError["overflows_debits_posted"] = 31] = "overflows_debits_posted";
75
- CreateTransferError[CreateTransferError["overflows_credits_posted"] = 32] = "overflows_credits_posted";
76
- CreateTransferError[CreateTransferError["overflows_debits"] = 33] = "overflows_debits";
77
- CreateTransferError[CreateTransferError["overflows_credits"] = 34] = "overflows_credits";
78
- CreateTransferError[CreateTransferError["exceeds_credits"] = 35] = "exceeds_credits";
79
- CreateTransferError[CreateTransferError["exceeds_debits"] = 36] = "exceeds_debits";
80
- CreateTransferError[CreateTransferError["cannot_post_and_void_pending_transfer"] = 37] = "cannot_post_and_void_pending_transfer";
81
- CreateTransferError[CreateTransferError["pending_transfer_cannot_post_or_void_another"] = 38] = "pending_transfer_cannot_post_or_void_another";
82
- CreateTransferError[CreateTransferError["timeout_reserved_for_pending_transfer"] = 39] = "timeout_reserved_for_pending_transfer";
83
- CreateTransferError[CreateTransferError["pending_id_must_not_be_zero"] = 40] = "pending_id_must_not_be_zero";
84
- CreateTransferError[CreateTransferError["pending_id_must_not_be_int_max"] = 41] = "pending_id_must_not_be_int_max";
85
- CreateTransferError[CreateTransferError["pending_id_must_be_different"] = 42] = "pending_id_must_be_different";
86
- CreateTransferError[CreateTransferError["pending_transfer_not_found"] = 43] = "pending_transfer_not_found";
87
- CreateTransferError[CreateTransferError["pending_transfer_not_pending"] = 44] = "pending_transfer_not_pending";
88
- CreateTransferError[CreateTransferError["pending_transfer_has_different_debit_account_id"] = 45] = "pending_transfer_has_different_debit_account_id";
89
- CreateTransferError[CreateTransferError["pending_transfer_has_different_credit_account_id"] = 46] = "pending_transfer_has_different_credit_account_id";
90
- CreateTransferError[CreateTransferError["pending_transfer_has_different_ledger"] = 47] = "pending_transfer_has_different_ledger";
91
- CreateTransferError[CreateTransferError["pending_transfer_has_different_code"] = 48] = "pending_transfer_has_different_code";
92
- CreateTransferError[CreateTransferError["exceeds_pending_transfer_amount"] = 49] = "exceeds_pending_transfer_amount";
93
- CreateTransferError[CreateTransferError["pending_transfer_has_different_amount"] = 50] = "pending_transfer_has_different_amount";
94
- CreateTransferError[CreateTransferError["pending_transfer_already_posted"] = 51] = "pending_transfer_already_posted";
95
- CreateTransferError[CreateTransferError["pending_transfer_already_voided"] = 52] = "pending_transfer_already_voided";
96
- CreateTransferError[CreateTransferError["pending_transfer_expired"] = 53] = "pending_transfer_expired";
42
+ CreateTransferError[CreateTransferError["linked_event_chain_open"] = 2] = "linked_event_chain_open";
43
+ CreateTransferError[CreateTransferError["reserved_flag"] = 3] = "reserved_flag";
44
+ CreateTransferError[CreateTransferError["reserved_field"] = 4] = "reserved_field";
45
+ CreateTransferError[CreateTransferError["id_must_not_be_zero"] = 5] = "id_must_not_be_zero";
46
+ CreateTransferError[CreateTransferError["id_must_not_be_int_max"] = 6] = "id_must_not_be_int_max";
47
+ CreateTransferError[CreateTransferError["debit_account_id_must_not_be_zero"] = 7] = "debit_account_id_must_not_be_zero";
48
+ CreateTransferError[CreateTransferError["debit_account_id_must_not_be_int_max"] = 8] = "debit_account_id_must_not_be_int_max";
49
+ CreateTransferError[CreateTransferError["credit_account_id_must_not_be_zero"] = 9] = "credit_account_id_must_not_be_zero";
50
+ CreateTransferError[CreateTransferError["credit_account_id_must_not_be_int_max"] = 10] = "credit_account_id_must_not_be_int_max";
51
+ CreateTransferError[CreateTransferError["accounts_must_be_different"] = 11] = "accounts_must_be_different";
52
+ CreateTransferError[CreateTransferError["pending_id_must_be_zero"] = 12] = "pending_id_must_be_zero";
53
+ CreateTransferError[CreateTransferError["pending_transfer_must_timeout"] = 13] = "pending_transfer_must_timeout";
54
+ CreateTransferError[CreateTransferError["ledger_must_not_be_zero"] = 14] = "ledger_must_not_be_zero";
55
+ CreateTransferError[CreateTransferError["code_must_not_be_zero"] = 15] = "code_must_not_be_zero";
56
+ CreateTransferError[CreateTransferError["amount_must_not_be_zero"] = 16] = "amount_must_not_be_zero";
57
+ CreateTransferError[CreateTransferError["debit_account_not_found"] = 17] = "debit_account_not_found";
58
+ CreateTransferError[CreateTransferError["credit_account_not_found"] = 18] = "credit_account_not_found";
59
+ CreateTransferError[CreateTransferError["accounts_must_have_the_same_ledger"] = 19] = "accounts_must_have_the_same_ledger";
60
+ CreateTransferError[CreateTransferError["transfer_must_have_the_same_ledger_as_accounts"] = 20] = "transfer_must_have_the_same_ledger_as_accounts";
61
+ CreateTransferError[CreateTransferError["exists_with_different_flags"] = 21] = "exists_with_different_flags";
62
+ CreateTransferError[CreateTransferError["exists_with_different_debit_account_id"] = 22] = "exists_with_different_debit_account_id";
63
+ CreateTransferError[CreateTransferError["exists_with_different_credit_account_id"] = 23] = "exists_with_different_credit_account_id";
64
+ CreateTransferError[CreateTransferError["exists_with_different_user_data"] = 24] = "exists_with_different_user_data";
65
+ CreateTransferError[CreateTransferError["exists_with_different_pending_id"] = 25] = "exists_with_different_pending_id";
66
+ CreateTransferError[CreateTransferError["exists_with_different_timeout"] = 26] = "exists_with_different_timeout";
67
+ CreateTransferError[CreateTransferError["exists_with_different_code"] = 27] = "exists_with_different_code";
68
+ CreateTransferError[CreateTransferError["exists_with_different_amount"] = 28] = "exists_with_different_amount";
69
+ CreateTransferError[CreateTransferError["exists"] = 29] = "exists";
70
+ CreateTransferError[CreateTransferError["overflows_debits_pending"] = 30] = "overflows_debits_pending";
71
+ CreateTransferError[CreateTransferError["overflows_credits_pending"] = 31] = "overflows_credits_pending";
72
+ CreateTransferError[CreateTransferError["overflows_debits_posted"] = 32] = "overflows_debits_posted";
73
+ CreateTransferError[CreateTransferError["overflows_credits_posted"] = 33] = "overflows_credits_posted";
74
+ CreateTransferError[CreateTransferError["overflows_debits"] = 34] = "overflows_debits";
75
+ CreateTransferError[CreateTransferError["overflows_credits"] = 35] = "overflows_credits";
76
+ CreateTransferError[CreateTransferError["exceeds_credits"] = 36] = "exceeds_credits";
77
+ CreateTransferError[CreateTransferError["exceeds_debits"] = 37] = "exceeds_debits";
78
+ CreateTransferError[CreateTransferError["cannot_post_and_void_pending_transfer"] = 38] = "cannot_post_and_void_pending_transfer";
79
+ CreateTransferError[CreateTransferError["pending_transfer_cannot_post_or_void_another"] = 39] = "pending_transfer_cannot_post_or_void_another";
80
+ CreateTransferError[CreateTransferError["timeout_reserved_for_pending_transfer"] = 40] = "timeout_reserved_for_pending_transfer";
81
+ CreateTransferError[CreateTransferError["pending_id_must_not_be_zero"] = 41] = "pending_id_must_not_be_zero";
82
+ CreateTransferError[CreateTransferError["pending_id_must_not_be_int_max"] = 42] = "pending_id_must_not_be_int_max";
83
+ CreateTransferError[CreateTransferError["pending_id_must_be_different"] = 43] = "pending_id_must_be_different";
84
+ CreateTransferError[CreateTransferError["pending_transfer_not_found"] = 44] = "pending_transfer_not_found";
85
+ CreateTransferError[CreateTransferError["pending_transfer_not_pending"] = 45] = "pending_transfer_not_pending";
86
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_debit_account_id"] = 46] = "pending_transfer_has_different_debit_account_id";
87
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_credit_account_id"] = 47] = "pending_transfer_has_different_credit_account_id";
88
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_ledger"] = 48] = "pending_transfer_has_different_ledger";
89
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_code"] = 49] = "pending_transfer_has_different_code";
90
+ CreateTransferError[CreateTransferError["exceeds_pending_transfer_amount"] = 50] = "exceeds_pending_transfer_amount";
91
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_amount"] = 51] = "pending_transfer_has_different_amount";
92
+ CreateTransferError[CreateTransferError["pending_transfer_already_posted"] = 52] = "pending_transfer_already_posted";
93
+ CreateTransferError[CreateTransferError["pending_transfer_already_voided"] = 53] = "pending_transfer_already_voided";
94
+ CreateTransferError[CreateTransferError["pending_transfer_expired"] = 54] = "pending_transfer_expired";
97
95
  })(CreateTransferError = exports.CreateTransferError || (exports.CreateTransferError = {}));
98
96
  var Operation;
99
97
  (function (Operation) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const binding: Binding = require('./client.node')\ninterface Binding {\n init: (args: BindingInitArgs) => Context\n request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void\n raw_request: (context: Context, operation: Operation, raw_batch: Buffer, result: ResultCallback) => void\n tick: (context: Context) => void,\n deinit: (context: Context) => void,\n tick_ms: number\n}\n\ninterface BindingInitArgs {\n cluster_id: number, // u32\n replica_addresses: Buffer,\n}\n\nexport interface InitArgs {\n cluster_id: number, // u32\n replica_addresses: Array<string | number>,\n}\n\nexport type Context = object\n\nexport type Account = {\n id: bigint // u128\n user_data: bigint // u128\n reserved: Buffer // [48]u8\n ledger: number // u32, ledger of value\n code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)\n flags: number // u16\n debits_pending: bigint // u64\n debits_posted: bigint // u64\n credits_pending: bigint // u64\n credits_posted: bigint // u64\n timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server\n}\n\nexport enum AccountFlags {\n linked = (1 << 0),\n debits_must_not_exceed_credits = (1 << 1),\n credits_must_not_exceed_debits = (1 << 2)\n}\n\nexport enum CreateAccountError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n\n mutually_exclusive_flags,\n\n overflows_debits,\n overflows_credits,\n\n exceeds_credits,\n exceeds_debits,\n\n exists_with_different_flags,\n exists_with_different_user_data,\n exists_with_different_ledger,\n exists_with_different_code,\n exists_with_different_debits_pending,\n exists_with_different_debits_posted,\n exists_with_different_credits_pending,\n exists_with_different_credits_posted,\n exists,\n}\n\nexport type CreateAccountsError = {\n index: number,\n code: CreateAccountError,\n}\n\nexport type Transfer = {\n id: bigint, // u128\n debit_account_id: bigint, // u128\n credit_account_id: bigint, // u128\n user_data: bigint, // u128\n reserved: bigint, // u128\n pending_id: bigint, // u128\n timeout: bigint, // u64, In nanoseconds.\n ledger: number // u32, The ledger of value.\n code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).\n flags: number, // u16\n amount: bigint, // u64,\n timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.\n}\n\nexport enum TransferFlags {\n linked = (1 << 0),\n pending = (1 << 1),\n post_pending_transfer = (1 << 2),\n void_pending_transfer = (1 << 3)\n}\n\nexport enum CreateTransferError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n debit_account_id_must_not_be_zero,\n debit_account_id_must_not_be_int_max,\n credit_account_id_must_not_be_zero,\n credit_account_id_must_not_be_int_max,\n accounts_must_be_different,\n\n pending_id_must_be_zero,\n pending_transfer_must_timeout,\n\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n amount_must_not_be_zero,\n\n debit_account_not_found,\n credit_account_not_found,\n\n accounts_must_have_the_same_ledger,\n transfer_must_have_the_same_ledger_as_accounts,\n\n exists_with_different_flags,\n exists_with_different_debit_account_id,\n exists_with_different_credit_account_id,\n exists_with_different_user_data,\n exists_with_different_pending_id,\n exists_with_different_timeout,\n exists_with_different_code,\n exists_with_different_amount,\n exists,\n\n overflows_debits_pending,\n overflows_credits_pending,\n overflows_debits_posted,\n overflows_credits_posted,\n overflows_debits,\n overflows_credits,\n\n exceeds_credits,\n exceeds_debits,\n\n cannot_post_and_void_pending_transfer,\n pending_transfer_cannot_post_or_void_another,\n timeout_reserved_for_pending_transfer,\n\n pending_id_must_not_be_zero,\n pending_id_must_not_be_int_max,\n pending_id_must_be_different,\n\n pending_transfer_not_found,\n pending_transfer_not_pending,\n\n pending_transfer_has_different_debit_account_id,\n pending_transfer_has_different_credit_account_id,\n pending_transfer_has_different_ledger,\n pending_transfer_has_different_code,\n\n exceeds_pending_transfer_amount,\n pending_transfer_has_different_amount,\n\n pending_transfer_already_posted,\n pending_transfer_already_voided,\n\n pending_transfer_expired,\n}\n\nexport type CreateTransfersError = {\n index: number,\n code: CreateTransferError,\n}\n\nexport type AccountID = bigint // u128\nexport type TransferID = bigint // u128\n\nexport type Event = Account | Transfer | AccountID | TransferID\nexport type Result = CreateAccountsError | CreateTransfersError | Account | Transfer\nexport type ResultCallback = (error: undefined | Error, results: Result[]) => void\n\nexport enum Operation {\n CREATE_ACCOUNT = 3,\n CREATE_TRANSFER,\n ACCOUNT_LOOKUP,\n TRANSFER_LOOKUP\n}\n\nexport interface Client {\n createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>\n createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>\n lookupAccounts: (batch: AccountID[]) => Promise<Account[]>\n lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>\n request: (operation: Operation, batch: Event[], callback: ResultCallback) => void\n rawRequest: (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => void\n destroy: () => void\n}\n\nlet _args: InitArgs | undefined = undefined\nconst isSameArgs = (args: InitArgs): boolean => {\n if (typeof _args === 'undefined') {\n return false\n }\n\n if (_args.replica_addresses.length !== args.replica_addresses.length) {\n return false\n }\n\n let isSameReplicas = true\n args.replica_addresses.forEach((entry, index) => {\n if (_args?.replica_addresses[index] !== entry) {\n isSameReplicas = false\n }\n })\n\n return args.cluster_id === _args.cluster_id && isSameReplicas\n}\n\nlet _client: Client | undefined = undefined\nlet _interval: NodeJS.Timeout | undefined = undefined\n// Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\nlet _pinged = false\n// TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.\nexport function createClient (args: InitArgs): Client {\n const duplicateArgs = isSameArgs(args)\n if (!duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with different arguments.')\n }\n\n if (duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with the same arguments.')\n }\n\n _args = Object.assign({}, { ...args })\n const context = binding.init({\n ...args,\n replica_addresses: Buffer.from(args.replica_addresses.join(','))\n })\n\n const request = (operation: Operation, batch: Event[], callback: ResultCallback) => {\n binding.request(context, operation, batch, callback)\n }\n\n const rawRequest = (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => {\n binding.raw_request(context, operation, rawBatch, callback)\n }\n\n const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateAccountsError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_ACCOUNT, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateTransfersError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_TRANSFER, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Account[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.ACCOUNT_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupTransfers = async (batch: TransferID[]): Promise<Transfer[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Transfer[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.TRANSFER_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const destroy = (): void => {\n binding.deinit(context)\n if (_interval){\n clearInterval(_interval)\n }\n _client = undefined\n }\n\n _client = {\n createAccounts,\n createTransfers,\n lookupAccounts,\n lookupTransfers,\n request,\n rawRequest,\n destroy\n }\n\n _interval = setInterval(() => {\n binding.tick(context)\n }, binding.tick_ms)\n\n return _client\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const binding: Binding = require('./client.node')\ninterface Binding {\n init: (args: BindingInitArgs) => Context\n request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void\n raw_request: (context: Context, operation: Operation, raw_batch: Buffer, result: ResultCallback) => void\n tick: (context: Context) => void,\n deinit: (context: Context) => void,\n tick_ms: number\n}\n\ninterface BindingInitArgs {\n cluster_id: number, // u32\n replica_addresses: Buffer,\n}\n\nexport interface InitArgs {\n cluster_id: number, // u32\n replica_addresses: Array<string | number>,\n}\n\nexport type Context = object\n\nexport type Account = {\n id: bigint // u128\n user_data: bigint // u128\n reserved: Buffer // [48]u8\n ledger: number // u32, ledger of value\n code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)\n flags: number // u16\n debits_pending: bigint // u64\n debits_posted: bigint // u64\n credits_pending: bigint // u64\n credits_posted: bigint // u64\n timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server\n}\n\nexport enum AccountFlags {\n linked = (1 << 0),\n debits_must_not_exceed_credits = (1 << 1),\n credits_must_not_exceed_debits = (1 << 2)\n}\n\nexport enum CreateAccountError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n debits_pending_must_be_zero,\n debits_posted_must_be_zero,\n credits_pending_must_be_zero,\n credits_posted_must_be_zero,\n\n mutually_exclusive_flags,\n\n exists_with_different_flags,\n exists_with_different_user_data,\n exists_with_different_ledger,\n exists_with_different_code,\n exists,\n}\n\nexport type CreateAccountsError = {\n index: number,\n code: CreateAccountError,\n}\n\nexport type Transfer = {\n id: bigint, // u128\n debit_account_id: bigint, // u128\n credit_account_id: bigint, // u128\n user_data: bigint, // u128\n reserved: bigint, // u128\n pending_id: bigint, // u128\n timeout: bigint, // u64, In nanoseconds.\n ledger: number // u32, The ledger of value.\n code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).\n flags: number, // u16\n amount: bigint, // u64,\n timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.\n}\n\nexport enum TransferFlags {\n linked = (1 << 0),\n pending = (1 << 1),\n post_pending_transfer = (1 << 2),\n void_pending_transfer = (1 << 3)\n}\n\nexport enum CreateTransferError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n debit_account_id_must_not_be_zero,\n debit_account_id_must_not_be_int_max,\n credit_account_id_must_not_be_zero,\n credit_account_id_must_not_be_int_max,\n accounts_must_be_different,\n\n pending_id_must_be_zero,\n pending_transfer_must_timeout,\n\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n amount_must_not_be_zero,\n\n debit_account_not_found,\n credit_account_not_found,\n\n accounts_must_have_the_same_ledger,\n transfer_must_have_the_same_ledger_as_accounts,\n\n exists_with_different_flags,\n exists_with_different_debit_account_id,\n exists_with_different_credit_account_id,\n exists_with_different_user_data,\n exists_with_different_pending_id,\n exists_with_different_timeout,\n exists_with_different_code,\n exists_with_different_amount,\n exists,\n\n overflows_debits_pending,\n overflows_credits_pending,\n overflows_debits_posted,\n overflows_credits_posted,\n overflows_debits,\n overflows_credits,\n\n exceeds_credits,\n exceeds_debits,\n\n cannot_post_and_void_pending_transfer,\n pending_transfer_cannot_post_or_void_another,\n timeout_reserved_for_pending_transfer,\n\n pending_id_must_not_be_zero,\n pending_id_must_not_be_int_max,\n pending_id_must_be_different,\n\n pending_transfer_not_found,\n pending_transfer_not_pending,\n\n pending_transfer_has_different_debit_account_id,\n pending_transfer_has_different_credit_account_id,\n pending_transfer_has_different_ledger,\n pending_transfer_has_different_code,\n\n exceeds_pending_transfer_amount,\n pending_transfer_has_different_amount,\n\n pending_transfer_already_posted,\n pending_transfer_already_voided,\n\n pending_transfer_expired,\n}\n\nexport type CreateTransfersError = {\n index: number,\n code: CreateTransferError,\n}\n\nexport type AccountID = bigint // u128\nexport type TransferID = bigint // u128\n\nexport type Event = Account | Transfer | AccountID | TransferID\nexport type Result = CreateAccountsError | CreateTransfersError | Account | Transfer\nexport type ResultCallback = (error: undefined | Error, results: Result[]) => void\n\nexport enum Operation {\n CREATE_ACCOUNT = 3,\n CREATE_TRANSFER,\n ACCOUNT_LOOKUP,\n TRANSFER_LOOKUP\n}\n\nexport interface Client {\n createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>\n createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>\n lookupAccounts: (batch: AccountID[]) => Promise<Account[]>\n lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>\n request: (operation: Operation, batch: Event[], callback: ResultCallback) => void\n rawRequest: (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => void\n destroy: () => void\n}\n\nlet _args: InitArgs | undefined = undefined\nconst isSameArgs = (args: InitArgs): boolean => {\n if (typeof _args === 'undefined') {\n return false\n }\n\n if (_args.replica_addresses.length !== args.replica_addresses.length) {\n return false\n }\n\n let isSameReplicas = true\n args.replica_addresses.forEach((entry, index) => {\n if (_args?.replica_addresses[index] !== entry) {\n isSameReplicas = false\n }\n })\n\n return args.cluster_id === _args.cluster_id && isSameReplicas\n}\n\nlet _client: Client | undefined = undefined\nlet _interval: NodeJS.Timeout | undefined = undefined\n// Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\nlet _pinged = false\n// TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.\nexport function createClient (args: InitArgs): Client {\n const duplicateArgs = isSameArgs(args)\n if (!duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with different arguments.')\n }\n\n if (duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with the same arguments.')\n }\n\n _args = Object.assign({}, { ...args })\n const context = binding.init({\n ...args,\n replica_addresses: Buffer.from(args.replica_addresses.join(','))\n })\n\n const request = (operation: Operation, batch: Event[], callback: ResultCallback) => {\n binding.request(context, operation, batch, callback)\n }\n\n const rawRequest = (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => {\n binding.raw_request(context, operation, rawBatch, callback)\n }\n\n const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateAccountsError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_ACCOUNT, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateTransfersError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_TRANSFER, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Account[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.ACCOUNT_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupTransfers = async (batch: TransferID[]): Promise<Transfer[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Transfer[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.TRANSFER_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const destroy = (): void => {\n binding.deinit(context)\n if (_interval){\n clearInterval(_interval)\n }\n _client = undefined\n }\n\n _client = {\n createAccounts,\n createTransfers,\n lookupAccounts,\n lookupTransfers,\n request,\n rawRequest,\n destroy\n }\n\n _interval = setInterval(() => {\n binding.tick(context)\n }, binding.tick_ms)\n\n return _client\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "tigerbeetle-node",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "TigerBeetle Node.js client",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/coilhq/tigerbeetle-node.git"
9
+ "url": "git+https://github.com/tigerbeetledb/tigerbeetle-node.git"
10
10
  },
11
11
  "preferUnplugged": true,
12
12
  "files": [
@@ -34,21 +34,21 @@
34
34
  "benchmark": "./scripts/benchmark.sh",
35
35
  "test": "node dist/test",
36
36
  "postinstall": "npm run install_zig && npm run download_node_headers && npm run build_lib",
37
- "install_zig": "./src/tigerbeetle/scripts/install_zig.sh",
38
- "download_node_headers": "./scripts/download_node_headers.sh",
37
+ "install_zig": "sh ./src/tigerbeetle/scripts/install_zig.sh",
38
+ "download_node_headers": "sh ./scripts/download_node_headers.sh",
39
39
  "build": "npm run build_tsc && npm run build_lib",
40
40
  "build_tsc": "./node_modules/typescript/bin/tsc",
41
41
  "build_lib": "mkdir -p dist && zig/zig build-lib -mcpu=baseline -OReleaseSafe -dynamic -lc -isystem build/node-$(node --version)/include/node src/node.zig -fallow-shlib-undefined -femit-bin=dist/client.node",
42
42
  "prepack": "git submodule deinit --all && git submodule update --init && npm run build_tsc",
43
43
  "clean": "rm -rf build dist node_modules src/zig-cache zig"
44
44
  },
45
- "author": "Coil Technologies, Inc",
45
+ "author": "TigerBeetle, Inc",
46
46
  "license": "Apache-2.0",
47
47
  "contributors": [
48
48
  "Donovan Changfoot <don@coil.com>",
49
49
  "Isaac Freund <isaac.freund@coil.com>",
50
50
  "Jason Bruwer <jason.bruwer@coil.com>",
51
- "Joran Dirk Greef <joran@coil.com>"
51
+ "Joran Dirk Greef <joran@tigerbeetle.com>"
52
52
  ],
53
53
  "devDependencies": {
54
54
  "@types/node": "^14.14.41",
@@ -1,4 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env sh
2
+
2
3
  set -e
3
4
 
4
5
  # Ask node for headers
@@ -7,19 +8,25 @@ HEADERS_URL=$(node -p 'process.release.headersUrl')
7
8
  # Work out the filename from the URL, as well as the directory without the ".tar.gz" file extension:
8
9
  rm -rf ./build
9
10
  mkdir build
10
- HEADERS_TARBALL=./build/`basename "$HEADERS_URL"`
11
+ HEADERS_TARBALL=./build/$(basename "$HEADERS_URL")
11
12
 
12
13
  # Download, making sure we download to the same output document, without wget adding "-1" etc. if the file was previously partially downloaded:
13
14
  echo "Downloading $HEADERS_URL..."
14
- if command -v wget &> /dev/null; then
15
+ if command -v wget; then
15
16
  # -4 forces `wget` to connect to ipv4 addresses, as ipv6 fails to resolve on certain distros.
16
17
  # Only A records (for ipv4) are used in DNS:
17
- wget -4 --quiet --show-progress --output-document=$HEADERS_TARBALL $HEADERS_URL
18
+ ipv4="-4"
19
+ # But Alpine doesn't support this argument
20
+ if [ -f /etc/alpine-release ]; then
21
+ ipv4=""
22
+ fi
23
+
24
+ wget $ipv4 --output-document="$HEADERS_TARBALL" "$HEADERS_URL"
18
25
  else
19
- curl --silent --progress-bar --output $HEADERS_TARBALL $HEADERS_URL
26
+ curl --output "$HEADERS_TARBALL" "$HEADERS_URL"
20
27
  fi
21
28
 
22
29
  # Extract and then remove the downloaded tarball:
23
30
  echo "Extracting $HEADERS_TARBALL..."
24
- tar -xf $HEADERS_TARBALL -C ./build
25
- rm $HEADERS_TARBALL
31
+ tar -xf "$HEADERS_TARBALL" -C ./build
32
+ rm "$HEADERS_TARBALL"
package/src/index.ts CHANGED
@@ -43,6 +43,7 @@ export enum AccountFlags {
43
43
  export enum CreateAccountError {
44
44
  // ok = 0 (No Error)
45
45
  linked_event_failed = 1,
46
+ linked_event_chain_open,
46
47
 
47
48
  reserved_flag,
48
49
  reserved_field,
@@ -51,23 +52,17 @@ export enum CreateAccountError {
51
52
  id_must_not_be_int_max,
52
53
  ledger_must_not_be_zero,
53
54
  code_must_not_be_zero,
55
+ debits_pending_must_be_zero,
56
+ debits_posted_must_be_zero,
57
+ credits_pending_must_be_zero,
58
+ credits_posted_must_be_zero,
54
59
 
55
60
  mutually_exclusive_flags,
56
61
 
57
- overflows_debits,
58
- overflows_credits,
59
-
60
- exceeds_credits,
61
- exceeds_debits,
62
-
63
62
  exists_with_different_flags,
64
63
  exists_with_different_user_data,
65
64
  exists_with_different_ledger,
66
65
  exists_with_different_code,
67
- exists_with_different_debits_pending,
68
- exists_with_different_debits_posted,
69
- exists_with_different_credits_pending,
70
- exists_with_different_credits_posted,
71
66
  exists,
72
67
  }
73
68
 
@@ -101,6 +96,7 @@ export enum TransferFlags {
101
96
  export enum CreateTransferError {
102
97
  // ok = 0 (No Error)
103
98
  linked_event_failed = 1,
99
+ linked_event_chain_open,
104
100
 
105
101
  reserved_flag,
106
102
  reserved_field,
package/src/node.zig CHANGED
@@ -13,7 +13,9 @@ const CreateAccountsResult = tb.CreateAccountsResult;
13
13
  const CreateTransfersResult = tb.CreateTransfersResult;
14
14
 
15
15
  const Storage = @import("tigerbeetle/src/storage.zig").Storage;
16
- const StateMachine = @import("tigerbeetle/src/state_machine.zig").StateMachineType(Storage);
16
+ const StateMachine = @import("tigerbeetle/src/state_machine.zig").StateMachineType(Storage, .{
17
+ .message_body_size_max = config.message_body_size_max,
18
+ });
17
19
  const Operation = StateMachine.Operation;
18
20
  const MessageBus = @import("tigerbeetle/src/message_bus.zig").MessageBusClient;
19
21
  const MessagePool = @import("tigerbeetle/src/message_pool.zig").MessagePool;
@@ -24,7 +26,8 @@ const vsr = @import("tigerbeetle/src/vsr.zig");
24
26
  const Header = vsr.Header;
25
27
  const Client = vsr.Client(StateMachine, MessageBus);
26
28
 
27
- pub const log_level: std.log.Level = .info;
29
+ // Since this is running in application space, log only critical messages to reduce noise.
30
+ pub const log_level: std.log.Level = .err;
28
31
 
29
32
  /// N-API will call this constructor automatically to register the module.
30
33
  export fn napi_register_module_v1(env: c.napi_env, exports: c.napi_value) c.napi_value {
@@ -137,7 +140,7 @@ const Context = struct {
137
140
  context.message_pool = try MessagePool.init(allocator, .client);
138
141
  errdefer context.message_pool.deinit(allocator);
139
142
 
140
- context.addresses = try vsr.parse_addresses(allocator, addresses_raw);
143
+ context.addresses = try vsr.parse_addresses(allocator, addresses_raw, config.replicas_max);
141
144
  errdefer allocator.free(context.addresses);
142
145
  assert(context.addresses.len > 0);
143
146
 
@@ -50,7 +50,7 @@ for I in $REPLICAS
50
50
  do
51
51
  echo "Starting replica $I..."
52
52
  FILE="./0_${I}.tigerbeetle.benchmark"
53
- ./tigerbeetle start --addresses=3001 "$FILE" > benchmark.log 2>&1 &
53
+ ./tigerbeetle start --addresses=3001 "$FILE" >> benchmark.log 2>&1 &
54
54
  done
55
55
 
56
56
  # Wait for replicas to start, listen and connect:
@@ -61,10 +61,10 @@ echo "Benchmarking..."
61
61
  zig/zig run -OReleaseSafe src/benchmark.zig
62
62
  echo ""
63
63
 
64
- for I in 0
64
+ for I in $REPLICAS
65
65
  do
66
66
  FILE="./0_${I}.tigerbeetle.benchmark"
67
- if [ -f $FILE ]; then
68
- rm $FILE
67
+ if [ -f "$FILE" ]; then
68
+ rm "$FILE"
69
69
  fi
70
70
  done
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ if [[ -z "$1" ]]; then
6
+ echo "Expected a first argument with a Docker image name or id"
7
+ exit 2
8
+ fi
9
+
10
+ if [[ "$2" != "--want-production" ]] && [[ "$2" != "--want-debug" ]]; then
11
+ echo "Expected a second argument: --want-production or --want-debug".
12
+ exit 2
13
+ fi
14
+
15
+ check="
16
+ set -eu
17
+
18
+ apt-get update -y
19
+ apt-get install -y binutils
20
+
21
+ is_production=false
22
+ # This getSymbolFromDwarf symbol only appears to be in the debug
23
+ # build, not the release build. So that's the test!
24
+ if ! [[ \$(nm -an /opt/beta-beetle/tigerbeetle | grep getSymbolFromDwarf) ]]; then
25
+ is_production=true
26
+ fi
27
+ "
28
+
29
+ if [[ "$2" == '--want-production' ]]; then
30
+ cmd+="
31
+ if [[ \$is_production == false ]]; then
32
+ echo 'Does not seem to be a production build'
33
+ exit 1
34
+ fi"
35
+ else
36
+ cmd+="
37
+ if [[ \$is_production == true ]]; then
38
+ echo 'Does not seem to be a debug build'
39
+ exit 1
40
+ fi"
41
+ fi
42
+
43
+ # We accept a passed-in arg
44
+ docker run --entrypoint bash "$1" -c "$check"
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ # Repeatedly runs some zig build command with different seeds and stores the output in the current directory.
5
+ # Eg `fuzz_repeatedly.sh lsm_forest_fuzz` will run `zig build lsm_forest_fuzz -- seed $SEED > fuzz_lsm_forest_fuzz_${SEED}`
6
+ # Use ./fuzz_unique_errors.sh to analyze the results.
7
+
8
+ FUZZ_COMMAND=$1
9
+
10
+ while true; do
11
+ SEED=$(od -A n -t u8 -N 8 /dev/urandom | xargs)
12
+ (zig build "$FUZZ_COMMAND" -Drelease-safe=true -- --seed "$SEED") || \
13
+ (zig build "$FUZZ_COMMAND" -- --seed "$SEED" 2> "fuzz_${FUZZ_COMMAND}_${SEED}") || \
14
+ true
15
+ done
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ # After running ./fuzz_loop.sh use this script to produce a list of unique crashes.
5
+ # As a heuristic, we look for the first line of the stacktrace that occurs inside tigerbeetle code.
6
+
7
+ grep -m 1 'tigerbeetle/src' fuzz_* | sort -u -t':' -k2,2
@@ -1,7 +1,22 @@
1
- #!/bin/bash
2
- set -eEuo pipefail
1
+ #!/usr/bin/env sh
2
+
3
+ if [ -z "$DEBUG" ]; then
4
+ debug="$DEBUG"
5
+ fi
6
+
7
+ debug="$DEBUG"
8
+ if [ "$1" = "--debug" ]; then
9
+ debug="true"
10
+ fi
11
+
12
+ set -eu
3
13
 
4
14
  scripts/install_zig.sh
5
- echo "Building TigerBeetle..."
6
- zig/zig build -Dcpu=baseline -Drelease-safe
15
+ if [ "$debug" = "true" ]; then
16
+ echo "Building Tigerbeetle debug..."
17
+ zig/zig build -Dcpu=baseline
18
+ else
19
+ echo "Building TigerBeetle..."
20
+ zig/zig build -Dcpu=baseline -Drelease-safe
21
+ fi
7
22
  mv zig-out/bin/tigerbeetle .
@@ -86,7 +86,11 @@ if exist %ZIG_DIRECTORY%\ (
86
86
 
87
87
  :: Extract and then remove the downloaded tarball:
88
88
  echo Extracting %ZIG_TARBALL%...
89
- powershell -Command "Expand-Archive %ZIG_TARBALL% -DestinationPath ."
89
+
90
+ :: Hiding Powershell's progress bar during the extraction
91
+ SET PS_DISABLE_PROGRESS="$ProgressPreference=[System.Management.Automation.ActionPreference]::SilentlyContinue"
92
+ powershell -Command "%PS_DISABLE_PROGRESS%;Expand-Archive %ZIG_TARBALL% -DestinationPath ."
93
+
90
94
  if not exist %ZIG_TARBALL% (
91
95
  echo Failed to extract zip file.
92
96
  exit 1
@@ -1,17 +1,17 @@
1
- #!/bin/bash
2
- set -eEuo pipefail
1
+ #!/usr/bin/env sh
2
+ set -eu
3
3
 
4
4
  ZIG_RELEASE_DEFAULT="0.9.1"
5
5
  # Default to the release build, or allow the latest dev build, or an explicit release version:
6
6
  ZIG_RELEASE=${1:-$ZIG_RELEASE_DEFAULT}
7
- if [ "$ZIG_RELEASE" == "latest" ]; then
7
+ if [ "$ZIG_RELEASE" = "latest" ]; then
8
8
  ZIG_RELEASE="builds"
9
9
  fi
10
10
 
11
11
  # Validate the release version explicitly:
12
- if [[ $ZIG_RELEASE =~ ^builds$ ]]; then
12
+ if echo "$ZIG_RELEASE" | grep -q '^builds$'; then
13
13
  echo "Installing Zig latest build..."
14
- elif [[ $ZIG_RELEASE =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
14
+ elif echo "$ZIG_RELEASE" | grep -q '^[0-9]\+.[0-9]\+.[0-9]\+$'; then
15
15
  echo "Installing Zig $ZIG_RELEASE release build..."
16
16
  else
17
17
  echo "Release version invalid"
@@ -19,26 +19,31 @@ else
19
19
  fi
20
20
 
21
21
  # Determine the architecture:
22
- if [[ $(uname -m) == 'arm64' ]] || [[ $(uname -m) == 'aarch64' ]]; then
22
+ if [ "$(uname -m)" = 'arm64' ] || [ "$(uname -m)" = 'aarch64' ]; then
23
23
  ZIG_ARCH="aarch64"
24
24
  else
25
25
  ZIG_ARCH="x86_64"
26
26
  fi
27
27
 
28
28
  # Determine the operating system:
29
- if [[ "$OSTYPE" == "darwin"* ]]; then
30
- ZIG_OS="macos"
31
- else
29
+ if [ "$(uname)" = "Linux" ]; then
32
30
  ZIG_OS="linux"
31
+ else
32
+ ZIG_OS="macos"
33
33
  fi
34
34
 
35
35
  ZIG_TARGET="zig-$ZIG_OS-$ZIG_ARCH"
36
36
 
37
37
  # Determine the build, split the JSON line on whitespace and extract the 2nd field, then remove quotes and commas:
38
- if command -v wget &> /dev/null; then
38
+ if command -v wget; then
39
39
  # -4 forces `wget` to connect to ipv4 addresses, as ipv6 fails to resolve on certain distros.
40
40
  # Only A records (for ipv4) are used in DNS:
41
- ZIG_URL=$(wget -4 --quiet -O - https://ziglang.org/download/index.json | grep -F "$ZIG_TARGET" | grep -F "$ZIG_RELEASE" | awk '{print $2}' | sed 's/[",]//g')
41
+ ipv4="-4"
42
+ # But Alpine doesn't support this argument
43
+ if [ -f /etc/alpine-release ]; then
44
+ ipv4=""
45
+ fi
46
+ ZIG_URL=$(wget $ipv4 --quiet -O - https://ziglang.org/download/index.json | grep -F "$ZIG_TARGET" | grep -F "$ZIG_RELEASE" | awk '{print $2}' | sed 's/[",]//g')
42
47
  else
43
48
  ZIG_URL=$(curl --silent https://ziglang.org/download/index.json | grep -F "$ZIG_TARGET" | grep -F "$ZIG_RELEASE" | awk '{print $2}' | sed 's/[",]//g')
44
49
  fi
@@ -55,12 +60,17 @@ ZIG_DIRECTORY=$(basename "$ZIG_TARBALL" .tar.xz)
55
60
 
56
61
  # Download, making sure we download to the same output document, without wget adding "-1" etc. if the file was previously partially downloaded:
57
62
  echo "Downloading $ZIG_URL..."
58
- if command -v wget &> /dev/null; then
63
+ if command -v wget; then
59
64
  # -4 forces `wget` to connect to ipv4 addresses, as ipv6 fails to resolve on certain distros.
60
65
  # Only A records (for ipv4) are used in DNS:
61
- wget -4 --quiet --show-progress --output-document="$ZIG_TARBALL" "$ZIG_URL"
66
+ ipv4="-4"
67
+ # But Alpine doesn't support this argument
68
+ if [ -f /etc/alpine-release ]; then
69
+ ipv4=""
70
+ fi
71
+ wget $ipv4 --quiet --output-document="$ZIG_TARBALL" "$ZIG_URL"
62
72
  else
63
- curl --silent --progress-bar --output "$ZIG_TARBALL" "$ZIG_URL"
73
+ curl --silent --output "$ZIG_TARBALL" "$ZIG_URL"
64
74
  fi
65
75
 
66
76
  # Extract and then remove the downloaded tarball: