tigerbeetle-node 0.11.2 → 0.11.4

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 (75) hide show
  1. package/dist/.client.node.sha256 +1 -1
  2. package/package.json +1 -1
  3. package/src/node.zig +6 -1
  4. package/src/tigerbeetle/src/benchmark.zig +1 -1
  5. package/src/tigerbeetle/src/c/tb_client/context.zig +1 -1
  6. package/src/tigerbeetle/src/c/tb_client/echo_client.zig +1 -1
  7. package/src/tigerbeetle/src/c/tb_client/thread.zig +1 -1
  8. package/src/tigerbeetle/src/c/tb_client.h +97 -111
  9. package/src/tigerbeetle/src/c/tb_client.zig +29 -18
  10. package/src/tigerbeetle/src/c/tb_client_header.zig +218 -0
  11. package/src/tigerbeetle/src/c/test.zig +7 -7
  12. package/src/tigerbeetle/src/cli.zig +4 -4
  13. package/src/tigerbeetle/src/config.zig +184 -374
  14. package/src/tigerbeetle/src/constants.zig +394 -0
  15. package/src/tigerbeetle/src/demo.zig +1 -1
  16. package/src/tigerbeetle/src/ewah.zig +18 -29
  17. package/src/tigerbeetle/src/ewah_fuzz.zig +130 -0
  18. package/src/tigerbeetle/src/io/darwin.zig +1 -1
  19. package/src/tigerbeetle/src/io/linux.zig +2 -2
  20. package/src/tigerbeetle/src/io/windows.zig +1 -1
  21. package/src/tigerbeetle/src/lsm/bloom_filter.zig +1 -1
  22. package/src/tigerbeetle/src/lsm/compaction.zig +55 -2
  23. package/src/tigerbeetle/src/lsm/forest.zig +1 -1
  24. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +15 -7
  25. package/src/tigerbeetle/src/lsm/grid.zig +1 -1
  26. package/src/tigerbeetle/src/lsm/groove.zig +5 -39
  27. package/src/tigerbeetle/src/lsm/level_iterator.zig +1 -1
  28. package/src/tigerbeetle/src/lsm/manifest.zig +1 -6
  29. package/src/tigerbeetle/src/lsm/manifest_level.zig +1 -1
  30. package/src/tigerbeetle/src/lsm/manifest_log.zig +1 -1
  31. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +14 -9
  32. package/src/tigerbeetle/src/lsm/posted_groove.zig +2 -13
  33. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +1 -1
  34. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +1 -1
  35. package/src/tigerbeetle/src/lsm/table.zig +25 -17
  36. package/src/tigerbeetle/src/lsm/table_immutable.zig +1 -1
  37. package/src/tigerbeetle/src/lsm/table_iterator.zig +1 -1
  38. package/src/tigerbeetle/src/lsm/table_mutable.zig +1 -1
  39. package/src/tigerbeetle/src/lsm/test.zig +1 -1
  40. package/src/tigerbeetle/src/lsm/tree.zig +47 -5
  41. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +22 -18
  42. package/src/tigerbeetle/src/main.zig +22 -16
  43. package/src/tigerbeetle/src/message_bus.zig +1 -1
  44. package/src/tigerbeetle/src/message_pool.zig +2 -2
  45. package/src/tigerbeetle/src/simulator.zig +3 -10
  46. package/src/tigerbeetle/src/state_machine.zig +627 -1806
  47. package/src/tigerbeetle/src/storage.zig +1 -1
  48. package/src/tigerbeetle/src/test/accounting/auditor.zig +1 -1
  49. package/src/tigerbeetle/src/test/accounting/workload.zig +1 -1
  50. package/src/tigerbeetle/src/test/cluster.zig +1 -1
  51. package/src/tigerbeetle/src/test/conductor.zig +1 -1
  52. package/src/tigerbeetle/src/test/fuzz.zig +19 -0
  53. package/src/tigerbeetle/src/test/message_bus.zig +1 -1
  54. package/src/tigerbeetle/src/test/network.zig +1 -1
  55. package/src/tigerbeetle/src/test/state_checker.zig +2 -2
  56. package/src/tigerbeetle/src/test/storage.zig +14 -5
  57. package/src/tigerbeetle/src/test/storage_checker.zig +1 -1
  58. package/src/tigerbeetle/src/test/table.zig +226 -0
  59. package/src/tigerbeetle/src/time.zig +1 -1
  60. package/src/tigerbeetle/src/tracer.zig +507 -0
  61. package/src/tigerbeetle/src/unit_tests.zig +2 -0
  62. package/src/tigerbeetle/src/vsr/client.zig +1 -1
  63. package/src/tigerbeetle/src/vsr/clock.zig +1 -1
  64. package/src/tigerbeetle/src/vsr/journal.zig +46 -115
  65. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +111 -0
  66. package/src/tigerbeetle/src/vsr/replica.zig +50 -159
  67. package/src/tigerbeetle/src/vsr/replica_format.zig +216 -0
  68. package/src/tigerbeetle/src/vsr/superblock.zig +1 -1
  69. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +1 -1
  70. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +3 -2
  71. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +2 -0
  72. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +8 -5
  73. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +1 -1
  74. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +2 -0
  75. package/src/tigerbeetle/src/vsr.zig +2 -2
@@ -1 +1 @@
1
- 5e64232ef290c0ed5f8b48762a2f9d03683e4a2ac5d74fc06ea594c035ec4b8b dist/client.node
1
+ 17ba799be39b3aa1c55b37b39f013d58b0c9d8a5e3356aa750951d4c3cc7e248 dist/client.node
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tigerbeetle-node",
3
- "version": "0.11.2",
3
+ "version": "0.11.4",
4
4
  "description": "TigerBeetle Node.js client",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
package/src/node.zig CHANGED
@@ -20,12 +20,17 @@ const Operation = StateMachine.Operation;
20
20
  const MessageBus = @import("tigerbeetle/src/message_bus.zig").MessageBusClient;
21
21
  const MessagePool = @import("tigerbeetle/src/message_pool.zig").MessagePool;
22
22
  const IO = @import("tigerbeetle/src/io.zig").IO;
23
- const config = @import("tigerbeetle/src/config.zig");
23
+ const config = @import("tigerbeetle/src/constants.zig");
24
24
 
25
25
  const vsr = @import("tigerbeetle/src/vsr.zig");
26
26
  const Header = vsr.Header;
27
27
  const Client = vsr.Client(StateMachine, MessageBus);
28
28
 
29
+ // TODO(jamii)
30
+ // This is a hack used to work around the absence of tigerbeetle_build_options.
31
+ // This should be removed once the node client is built using `zig build`.
32
+ pub const tracer_backend: @import("tigerbeetle/src/config.zig").TracerBackend = .none;
33
+
29
34
  // Since this is running in application space, log only critical messages to reduce noise.
30
35
  pub const log_level: std.log.Level = .err;
31
36
 
@@ -1,7 +1,7 @@
1
1
  const std = @import("std");
2
2
  const builtin = @import("builtin");
3
3
  const assert = std.debug.assert;
4
- const config = @import("config.zig");
4
+ const config = @import("constants.zig");
5
5
 
6
6
  const log = std.log;
7
7
  pub const log_level: std.log.Level = .err;
@@ -2,7 +2,7 @@ const std = @import("std");
2
2
  const os = std.os;
3
3
  const assert = std.debug.assert;
4
4
 
5
- const config = @import("../../config.zig");
5
+ const config = @import("../../constants.zig");
6
6
  const log = std.log.scoped(.tb_client_context);
7
7
 
8
8
  const util = @import("../../util.zig");
@@ -2,7 +2,7 @@ const std = @import("std");
2
2
  const assert = std.debug.assert;
3
3
  const mem = std.mem;
4
4
 
5
- const config = @import("../../config.zig");
5
+ const config = @import("../../constants.zig");
6
6
  const vsr = @import("../../vsr.zig");
7
7
  const Header = vsr.Header;
8
8
 
@@ -1,7 +1,7 @@
1
1
  const std = @import("std");
2
2
  const assert = std.debug.assert;
3
3
 
4
- const config = @import("../../config.zig");
4
+ const config = @import("../../constants.zig");
5
5
  const log = std.log.scoped(.tb_client_thread);
6
6
 
7
7
  const Packet = @import("packet.zig").Packet;
@@ -1,6 +1,11 @@
1
- #ifndef TB_CLIENT_C
2
- #define TB_CLIENT_C
3
-
1
+ //////////////////////////////////////////////////////////
2
+ // This file was auto-generated by tb_client_header.zig //
3
+ // Do not manually modify. //
4
+ //////////////////////////////////////////////////////////
5
+
6
+ #ifndef TB_CLIENT_H
7
+ #define TB_CLIENT_H
8
+
4
9
  #include <stddef.h>
5
10
  #include <stdint.h>
6
11
  #include <stdbool.h>
@@ -50,104 +55,84 @@ typedef struct tb_transfer_t {
50
55
  } tb_transfer_t;
51
56
 
52
57
  typedef enum TB_CREATE_ACCOUNT_RESULT {
53
- TB_CREATE_ACCOUNT_OK,
54
- TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED,
55
- TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN,
56
-
57
- TB_CREATE_ACCOUNT_RESERVED_FLAG,
58
- TB_CREATE_ACCOUNT_RESERVED_FIELD,
59
-
60
- TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO,
61
- TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX,
62
- TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO,
63
- TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO,
64
- TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO,
65
- TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO,
66
- TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO,
67
- TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO,
68
-
69
- TB_CREATE_ACCOUNT_MUTUALLY_EXCLUSIVE_FLAGS,
70
-
71
- TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS,
72
- TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA,
73
- TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER,
74
- TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE,
75
- TB_CREATE_ACCOUNT_EXISTS
58
+ TB_CREATE_ACCOUNT_OK = 0,
59
+ TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = 1,
60
+ TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = 2,
61
+ TB_CREATE_ACCOUNT_RESERVED_FLAG = 3,
62
+ TB_CREATE_ACCOUNT_RESERVED_FIELD = 4,
63
+ TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = 5,
64
+ TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 6,
65
+ TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = 7,
66
+ TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = 8,
67
+ TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = 9,
68
+ TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = 10,
69
+ TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = 11,
70
+ TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = 12,
71
+ TB_CREATE_ACCOUNT_MUTUALLY_EXCLUSIVE_FLAGS = 13,
72
+ TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = 14,
73
+ TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA = 15,
74
+ TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = 16,
75
+ TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = 17,
76
+ TB_CREATE_ACCOUNT_EXISTS = 18,
76
77
  } TB_CREATE_ACCOUNT_RESULT;
77
78
 
78
79
  typedef enum TB_CREATE_TRANSFER_RESULT {
79
- TB_CREATE_TRANSFER_OK,
80
- TB_CREATE_TRANSFER_LINKED_EVENT_FAILED,
81
- TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN,
82
-
83
- TB_CREATE_TRANSFER_RESERVED_FLAG,
84
- TB_CREATE_TRANSFER_RESERVED_FIELD,
85
-
86
- TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO,
87
- TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX,
88
- TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO,
89
- TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX,
90
- TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO,
91
- TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX,
92
- TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT,
93
-
94
- TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO,
95
- TB_CREATE_TRANSFER_PENDING_TRANSFER_MUST_TIMEOUT,
96
-
97
- TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO,
98
- TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO,
99
- TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO,
100
-
101
- TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND,
102
- TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND,
103
-
104
- TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER,
105
- TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS,
106
-
107
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS,
108
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID,
109
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID,
110
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA,
111
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID,
112
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT,
113
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE,
114
- TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT,
115
- TB_CREATE_TRANSFER_EXISTS,
116
-
117
- TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING,
118
- TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING,
119
- TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED,
120
- TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED,
121
- TB_CREATE_TRANSFER_OVERFLOWS_DEBITS,
122
- TB_CREATE_TRANSFER_OVERFLOWS_CREDITS,
123
- TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT,
124
-
125
- TB_CREATE_TRANSFER_EXCEEDS_CREDITS,
126
- TB_CREATE_TRANSFER_EXCEEDS_DEBITS,
127
-
128
- TB_CREATE_TRANSFER_CANNOT_POST_AND_VOID_PENDING_TRANSFER,
129
- TB_CREATE_TRANSFER_PENDING_TRANSFER_CANNOT_POST_OR_VOID_ANOTHER,
130
- TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER,
131
-
132
- TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO,
133
- TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX,
134
- TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT,
135
-
136
- TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND,
137
- TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING,
138
-
139
- TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID,
140
- TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID,
141
- TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER,
142
- TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE,
143
-
144
- TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT,
145
- TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT,
146
-
147
- TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED,
148
- TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED,
149
-
150
- TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED,
80
+ TB_CREATE_TRANSFER_OK = 0,
81
+ TB_CREATE_TRANSFER_LINKED_EVENT_FAILED = 1,
82
+ TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN = 2,
83
+ TB_CREATE_TRANSFER_RESERVED_FLAG = 3,
84
+ TB_CREATE_TRANSFER_RESERVED_FIELD = 4,
85
+ TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO = 5,
86
+ TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX = 6,
87
+ TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 7,
88
+ TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 8,
89
+ TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 9,
90
+ TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 10,
91
+ TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT = 11,
92
+ TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO = 12,
93
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_MUST_TIMEOUT = 13,
94
+ TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO = 14,
95
+ TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO = 15,
96
+ TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO = 16,
97
+ TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND = 17,
98
+ TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND = 18,
99
+ TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER = 19,
100
+ TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS = 20,
101
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS = 21,
102
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID = 22,
103
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID = 23,
104
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA = 24,
105
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID = 25,
106
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT = 26,
107
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE = 27,
108
+ TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT = 28,
109
+ TB_CREATE_TRANSFER_EXISTS = 29,
110
+ TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING = 30,
111
+ TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING = 31,
112
+ TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED = 32,
113
+ TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED = 33,
114
+ TB_CREATE_TRANSFER_OVERFLOWS_DEBITS = 34,
115
+ TB_CREATE_TRANSFER_OVERFLOWS_CREDITS = 35,
116
+ TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT = 36,
117
+ TB_CREATE_TRANSFER_EXCEEDS_CREDITS = 37,
118
+ TB_CREATE_TRANSFER_EXCEEDS_DEBITS = 38,
119
+ TB_CREATE_TRANSFER_CANNOT_POST_AND_VOID_PENDING_TRANSFER = 39,
120
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_CANNOT_POST_OR_VOID_ANOTHER = 40,
121
+ TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER = 41,
122
+ TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO = 42,
123
+ TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX = 43,
124
+ TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT = 44,
125
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND = 45,
126
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING = 46,
127
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID = 47,
128
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID = 48,
129
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER = 49,
130
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE = 50,
131
+ TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT = 51,
132
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT = 52,
133
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED = 53,
134
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED = 54,
135
+ TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED = 55,
151
136
  } TB_CREATE_TRANSFER_RESULT;
152
137
 
153
138
  typedef struct tb_create_accounts_result_t {
@@ -161,17 +146,17 @@ typedef struct tb_create_transfers_result_t {
161
146
  } tb_create_transfers_result_t;
162
147
 
163
148
  typedef enum TB_OPERATION {
164
- TB_OP_CREATE_ACCOUNTS = 3,
165
- TB_OP_CREATE_TRANSFERS = 4,
166
- TB_OP_LOOKUP_ACCOUNTS = 5,
167
- TB_OP_LOOKUP_TRANSFERS = 6
149
+ TB_OPERATION_CREATE_ACCOUNTS = 3,
150
+ TB_OPERATION_CREATE_TRANSFERS = 4,
151
+ TB_OPERATION_LOOKUP_ACCOUNTS = 5,
152
+ TB_OPERATION_LOOKUP_TRANSFERS = 6,
168
153
  } TB_OPERATION;
169
154
 
170
155
  typedef enum TB_PACKET_STATUS {
171
- TB_PACKET_OK,
172
- TB_PACKET_TOO_MUCH_DATA,
173
- TB_PACKET_INVALID_OPERATION,
174
- TB_PACKET_INVALID_DATA_SIZE
156
+ TB_PACKET_OK = 0,
157
+ TB_PACKET_TOO_MUCH_DATA = 1,
158
+ TB_PACKET_INVALID_OPERATION = 2,
159
+ TB_PACKET_INVALID_DATA_SIZE = 3,
175
160
  } TB_PACKET_STATUS;
176
161
 
177
162
  typedef struct tb_packet_t {
@@ -188,7 +173,7 @@ typedef struct tb_packet_list_t {
188
173
  struct tb_packet_t* tail;
189
174
  } tb_packet_list_t;
190
175
 
191
- typedef void* tb_client_t;
176
+ typedef void* tb_client_t;
192
177
 
193
178
  typedef enum TB_STATUS {
194
179
  TB_STATUS_SUCCESS = 0,
@@ -203,7 +188,7 @@ typedef enum TB_STATUS {
203
188
 
204
189
  TB_STATUS tb_client_init(
205
190
  tb_client_t* out_client,
206
- tb_packet_list_t* out_packets,
191
+ struct tb_packet_list_t* out_packets,
207
192
  uint32_t cluster_id,
208
193
  const char* address_ptr,
209
194
  uint32_t address_len,
@@ -214,7 +199,7 @@ TB_STATUS tb_client_init(
214
199
 
215
200
  TB_STATUS tb_client_init_echo(
216
201
  tb_client_t* out_client,
217
- tb_packet_list_t* out_packets,
202
+ struct tb_packet_list_t* out_packets,
218
203
  uint32_t cluster_id,
219
204
  const char* address_ptr,
220
205
  uint32_t address_len,
@@ -225,11 +210,12 @@ TB_STATUS tb_client_init_echo(
225
210
 
226
211
  void tb_client_submit(
227
212
  tb_client_t client,
228
- tb_packet_list_t* packets
213
+ struct tb_packet_list_t* packets
229
214
  );
230
215
 
231
216
  void tb_client_deinit(
232
217
  tb_client_t client
233
218
  );
234
219
 
235
- #endif // TB_CLIENT_C
220
+ #endif // TB_CLIENT_H
221
+
@@ -17,6 +17,7 @@ pub const tb_status_t = enum(c_int) {
17
17
  network_subsystem,
18
18
  };
19
19
 
20
+ pub const tb_operation_t = StateMachine.Operation;
20
21
  pub const tb_completion_t = fn (
21
22
  context: usize,
22
23
  client: tb_client_t,
@@ -25,7 +26,7 @@ pub const tb_completion_t = fn (
25
26
  result_len: u32,
26
27
  ) callconv(.C) void;
27
28
 
28
- const config = @import("../config.zig");
29
+ const config = @import("../constants.zig");
29
30
  const Storage = @import("../storage.zig").Storage;
30
31
  const MessageBus = @import("../message_bus.zig").MessageBusClient;
31
32
  const StateMachine = @import("../state_machine.zig").StateMachineType(Storage, .{
@@ -53,19 +54,17 @@ fn client_to_context(tb_client: tb_client_t) *ContextImplementation {
53
54
  return @ptrCast(*ContextImplementation, @alignCast(@alignOf(ContextImplementation), tb_client));
54
55
  }
55
56
 
56
- // Pick the most suitable allocator
57
- const global_allocator = if (builtin.is_test)
58
- std.testing.allocator
59
- else if (builtin.link_libc)
60
- std.heap.c_allocator
61
- else if (builtin.target.os.tag == .windows)
62
- (struct {
63
- var gpa = std.heap.HeapAllocator.init();
64
- }).gpa.allocator()
65
- else
66
- @compileError("tb_client must be built with libc");
67
-
68
- pub export fn tb_client_init(
57
+ // Only export the functions if we're compiling libtb_client.
58
+ // If it's only being imported by another zig file, then exporting the functions
59
+ // will force them to be evaluated/codegen/linked and trigger unexpected comptime paths.
60
+ comptime {
61
+ if (builtin.link_libc) {
62
+ @export(tb_client_init, .{ .name = "tb_client_init", .linkage = .Strong });
63
+ @export(tb_client_init_echo, .{ .name = "tb_client_init_echo", .linkage = .Strong });
64
+ }
65
+ }
66
+
67
+ pub fn tb_client_init(
69
68
  out_client: *tb_client_t,
70
69
  out_packets: *tb_packet_list_t,
71
70
  cluster_id: u32,
@@ -74,7 +73,7 @@ pub export fn tb_client_init(
74
73
  packets_count: u32,
75
74
  on_completion_ctx: usize,
76
75
  on_completion_fn: tb_completion_t,
77
- ) tb_status_t {
76
+ ) callconv(.C) tb_status_t {
78
77
  return init(
79
78
  DefaultContext,
80
79
  out_client,
@@ -88,7 +87,7 @@ pub export fn tb_client_init(
88
87
  );
89
88
  }
90
89
 
91
- pub export fn tb_client_init_echo(
90
+ pub fn tb_client_init_echo(
92
91
  out_client: *tb_client_t,
93
92
  out_packets: *tb_packet_list_t,
94
93
  cluster_id: u32,
@@ -97,7 +96,7 @@ pub export fn tb_client_init_echo(
97
96
  packets_count: u32,
98
97
  on_completion_ctx: usize,
99
98
  on_completion_fn: tb_completion_t,
100
- ) tb_status_t {
99
+ ) callconv(.C) tb_status_t {
101
100
  return init(
102
101
  TestingContext,
103
102
  out_client,
@@ -122,9 +121,21 @@ fn init(
122
121
  on_completion_ctx: usize,
123
122
  on_completion_fn: tb_completion_t,
124
123
  ) tb_status_t {
124
+ // Pick the most suitable allocator for the platform.
125
+ const allocator = if (builtin.is_test)
126
+ std.testing.allocator
127
+ else if (builtin.link_libc)
128
+ std.heap.c_allocator
129
+ else if (builtin.target.os.tag == .windows)
130
+ (struct {
131
+ var gpa = std.heap.HeapAllocator.init();
132
+ }).gpa.allocator()
133
+ else
134
+ @compileError("tb_client must be built with libc");
135
+
125
136
  const addresses = @ptrCast([*]const u8, addresses_ptr)[0..addresses_len];
126
137
  const context = Context.init(
127
- global_allocator,
138
+ allocator,
128
139
  cluster_id,
129
140
  addresses,
130
141
  packets_count,
@@ -0,0 +1,218 @@
1
+ const std = @import("std");
2
+ const tb = @import("../tigerbeetle.zig");
3
+ const tb_client = @import("tb_client.zig");
4
+
5
+ const type_mappings = .{
6
+ .{ tb.AccountFlags, "TB_ACCOUNT_FLAGS" },
7
+ .{ tb.Account, "tb_account_t" },
8
+ .{ tb.TransferFlags, "TB_TRANSFER_FLAGS" },
9
+ .{ tb.Transfer, "tb_transfer_t" },
10
+ .{ tb.CreateAccountResult, "TB_CREATE_ACCOUNT_RESULT" },
11
+ .{ tb.CreateTransferResult, "TB_CREATE_TRANSFER_RESULT" },
12
+ .{ tb.CreateAccountsResult, "tb_create_accounts_result_t" },
13
+ .{ tb.CreateTransfersResult, "tb_create_transfers_result_t" },
14
+ .{ tb_client.tb_operation_t, "TB_OPERATION" },
15
+ .{ tb_client.tb_packet_status_t, "TB_PACKET_STATUS" },
16
+ .{ tb_client.tb_packet_t, "tb_packet_t" },
17
+ .{ tb_client.tb_packet_list_t, "tb_packet_list_t" },
18
+ .{ tb_client.tb_client_t, "tb_client_t" },
19
+ .{ tb_client.tb_status_t, "TB_STATUS" },
20
+ };
21
+
22
+ fn resolve_c_type(comptime Type: type) []const u8 {
23
+ switch (@typeInfo(Type)) {
24
+ .Array => |info| return resolve_c_type(info.child),
25
+ .Enum => |info| return resolve_c_type(info.tag_type),
26
+ .Struct => return resolve_c_type(std.meta.Int(.unsigned, @bitSizeOf(Type))),
27
+ .Int => |info| {
28
+ std.debug.assert(info.signedness == .unsigned);
29
+ return switch (info.bits) {
30
+ 8 => "uint8_t",
31
+ 16 => "uint16_t",
32
+ 32 => "uint32_t",
33
+ 64 => "uint64_t",
34
+ 128 => "tb_uint128_t",
35
+ else => @compileError("invalid int type"),
36
+ };
37
+ },
38
+ .Optional => |info| switch (@typeInfo(info.child)) {
39
+ .Pointer => return resolve_c_type(info.child),
40
+ else => @compileError("Unsupported optional type: " ++ @typeName(Type)),
41
+ },
42
+ .Pointer => |info| {
43
+ std.debug.assert(info.size != .Slice);
44
+ std.debug.assert(!info.is_allowzero);
45
+
46
+ inline for (type_mappings) |type_mapping| {
47
+ const ZigType = type_mapping[0];
48
+ const c_name = type_mapping[1];
49
+
50
+ if (info.child == ZigType) {
51
+ const prefix = if (@typeInfo(ZigType) == .Struct) "struct " else "";
52
+ return prefix ++ c_name ++ "*";
53
+ }
54
+ }
55
+
56
+ return resolve_c_type(info.child) ++ "*";
57
+ },
58
+ .Void, .Opaque => return "void",
59
+ else => @compileError("Unhandled type: " ++ @typeName(Type)),
60
+ }
61
+ }
62
+
63
+ fn to_uppercase(comptime input: []const u8) []const u8 {
64
+ comptime var output: [input.len]u8 = undefined;
65
+ inline for (output) |*char, i| {
66
+ char.* = input[i];
67
+ char.* -= 32 * @as(u8, @boolToInt(char.* >= 'a' and char.* <= 'z'));
68
+ }
69
+ return &output;
70
+ }
71
+
72
+ fn emit_enum(
73
+ buffer: *std.ArrayList(u8),
74
+ comptime type_info: anytype,
75
+ comptime c_name: []const u8,
76
+ comptime value_fmt: []const u8,
77
+ comptime skip_fields: []const []const u8,
78
+ ) !void {
79
+ var suffix_pos = std.mem.lastIndexOf(u8, c_name, "_").?;
80
+ if (std.mem.count(u8, c_name, "_") == 1) suffix_pos = c_name.len;
81
+
82
+ try buffer.writer().print("typedef enum {s} {{\n", .{c_name});
83
+
84
+ inline for (type_info.fields) |field, i| {
85
+ comptime var skip = false;
86
+ inline for (skip_fields) |sf| {
87
+ skip = skip or comptime std.mem.eql(u8, sf, field.name);
88
+ }
89
+
90
+ if (!skip) {
91
+ try buffer.writer().print(" {s}_{s} = " ++ value_fmt ++ ",\n", .{
92
+ c_name[0..suffix_pos],
93
+ to_uppercase(field.name),
94
+ i,
95
+ });
96
+ }
97
+ }
98
+
99
+ try buffer.writer().print("}} {s};\n\n", .{c_name});
100
+ }
101
+
102
+ fn emit_struct(
103
+ buffer: *std.ArrayList(u8),
104
+ comptime type_info: anytype,
105
+ comptime c_name: []const u8,
106
+ ) !void {
107
+ try buffer.writer().print("typedef struct {s} {{\n", .{c_name});
108
+
109
+ inline for (type_info.fields) |field| {
110
+ try buffer.writer().print(" {s} {s}", .{
111
+ resolve_c_type(field.field_type),
112
+ field.name,
113
+ });
114
+
115
+ switch (@typeInfo(field.field_type)) {
116
+ .Array => |array| try buffer.writer().print("[{d}]", .{array.len}),
117
+ else => {},
118
+ }
119
+
120
+ try buffer.writer().print(";\n", .{});
121
+ }
122
+
123
+ try buffer.writer().print("}} {s};\n\n", .{c_name});
124
+ }
125
+
126
+ pub fn main() !void {
127
+ @setEvalBranchQuota(100_000);
128
+
129
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
130
+ defer arena.deinit();
131
+ const allocator = arena.allocator();
132
+
133
+ var buffer = std.ArrayList(u8).init(allocator);
134
+ try buffer.writer().print(
135
+ \\ //////////////////////////////////////////////////////////
136
+ \\ // This file was auto-generated by tb_client_header.zig //
137
+ \\ // Do not manually modify. //
138
+ \\ //////////////////////////////////////////////////////////
139
+ \\
140
+ \\#ifndef TB_CLIENT_H
141
+ \\#define TB_CLIENT_H
142
+ \\
143
+ \\#include <stddef.h>
144
+ \\#include <stdint.h>
145
+ \\#include <stdbool.h>
146
+ \\
147
+ \\typedef __uint128_t tb_uint128_t;
148
+ \\
149
+ \\
150
+ , .{});
151
+
152
+ // Emit C type declarations.
153
+ inline for (type_mappings) |type_mapping| {
154
+ const ZigType = type_mapping[0];
155
+ const c_name = type_mapping[1];
156
+
157
+ switch (@typeInfo(ZigType)) {
158
+ .Struct => |info| switch (info.layout) {
159
+ .Auto => @compileError("Invalid C struct type: " ++ @typeName(ZigType)),
160
+ .Packed => try emit_enum(&buffer, info, c_name, "1 << {d}", &.{"padding"}),
161
+ .Extern => try emit_struct(&buffer, info, c_name),
162
+ },
163
+ .Enum => |info| {
164
+ comptime var skip: []const []const u8 = &.{};
165
+ if (ZigType == tb_client.tb_operation_t) {
166
+ skip = &.{ "reserved", "root", "register" };
167
+ }
168
+
169
+ try emit_enum(&buffer, info, c_name, "{d}", skip);
170
+ },
171
+ else => try buffer.writer().print("typedef {s} {s}; \n\n", .{
172
+ resolve_c_type(ZigType),
173
+ c_name,
174
+ }),
175
+ }
176
+ }
177
+
178
+ // Emit C function declarations.
179
+ // TODO: use `std.meta.declaractions` and generate with pub + export functions.
180
+ // Zig 0.9.1 has `decl.data.Fn.arg_names` but it's currently/incorrectly a zero-sized slice.
181
+ try buffer.writer().print(
182
+ \\TB_STATUS tb_client_init(
183
+ \\ tb_client_t* out_client,
184
+ \\ struct tb_packet_list_t* out_packets,
185
+ \\ uint32_t cluster_id,
186
+ \\ const char* address_ptr,
187
+ \\ uint32_t address_len,
188
+ \\ uint32_t packets_count,
189
+ \\ uintptr_t on_completion_ctx,
190
+ \\ void (*on_completion_fn)(uintptr_t, tb_client_t, tb_packet_t*, const uint8_t*, uint32_t)
191
+ \\);
192
+ \\
193
+ \\TB_STATUS tb_client_init_echo(
194
+ \\ tb_client_t* out_client,
195
+ \\ struct tb_packet_list_t* out_packets,
196
+ \\ uint32_t cluster_id,
197
+ \\ const char* address_ptr,
198
+ \\ uint32_t address_len,
199
+ \\ uint32_t packets_count,
200
+ \\ uintptr_t on_completion_ctx,
201
+ \\ void (*on_completion_fn)(uintptr_t, tb_client_t, tb_packet_t*, const uint8_t*, uint32_t)
202
+ \\);
203
+ \\
204
+ \\void tb_client_submit(
205
+ \\ tb_client_t client,
206
+ \\ struct tb_packet_list_t* packets
207
+ \\);
208
+ \\
209
+ \\void tb_client_deinit(
210
+ \\ tb_client_t client
211
+ \\);
212
+ \\
213
+ \\
214
+ , .{});
215
+
216
+ try buffer.writer().print("#endif // TB_CLIENT_H\n\n", .{});
217
+ try std.fs.cwd().writeFile("src/c/tb_client.h", buffer.items);
218
+ }