tigerbeetle-node 0.11.3 → 0.11.5

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 (74) hide show
  1. package/dist/.client.node.sha256 +1 -1
  2. package/package.json +1 -1
  3. package/src/node.zig +10 -5
  4. package/src/tigerbeetle/src/benchmark.zig +4 -4
  5. package/src/tigerbeetle/src/c/tb_client/context.zig +6 -6
  6. package/src/tigerbeetle/src/c/tb_client/echo_client.zig +2 -2
  7. package/src/tigerbeetle/src/c/tb_client/thread.zig +0 -1
  8. package/src/tigerbeetle/src/c/tb_client.h +97 -111
  9. package/src/tigerbeetle/src/c/tb_client.zig +30 -19
  10. package/src/tigerbeetle/src/c/tb_client_header.zig +218 -0
  11. package/src/tigerbeetle/src/c/test.zig +14 -14
  12. package/src/tigerbeetle/src/cli.zig +12 -12
  13. package/src/tigerbeetle/src/config.zig +183 -379
  14. package/src/tigerbeetle/src/constants.zig +394 -0
  15. package/src/tigerbeetle/src/demo.zig +4 -4
  16. package/src/tigerbeetle/src/ewah_fuzz.zig +2 -0
  17. package/src/tigerbeetle/src/io/darwin.zig +4 -4
  18. package/src/tigerbeetle/src/io/linux.zig +6 -6
  19. package/src/tigerbeetle/src/io/windows.zig +4 -4
  20. package/src/tigerbeetle/src/lsm/bloom_filter.zig +1 -1
  21. package/src/tigerbeetle/src/lsm/compaction.zig +15 -10
  22. package/src/tigerbeetle/src/lsm/forest.zig +2 -2
  23. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +18 -15
  24. package/src/tigerbeetle/src/lsm/grid.zig +5 -5
  25. package/src/tigerbeetle/src/lsm/groove.zig +8 -42
  26. package/src/tigerbeetle/src/lsm/level_iterator.zig +2 -2
  27. package/src/tigerbeetle/src/lsm/manifest.zig +19 -23
  28. package/src/tigerbeetle/src/lsm/manifest_level.zig +2 -2
  29. package/src/tigerbeetle/src/lsm/manifest_log.zig +8 -8
  30. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +25 -12
  31. package/src/tigerbeetle/src/lsm/posted_groove.zig +4 -15
  32. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +13 -13
  33. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +2 -2
  34. package/src/tigerbeetle/src/lsm/table.zig +43 -35
  35. package/src/tigerbeetle/src/lsm/table_immutable.zig +4 -4
  36. package/src/tigerbeetle/src/lsm/table_iterator.zig +17 -9
  37. package/src/tigerbeetle/src/lsm/table_mutable.zig +3 -3
  38. package/src/tigerbeetle/src/lsm/test.zig +6 -6
  39. package/src/tigerbeetle/src/lsm/tree.zig +75 -47
  40. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +27 -28
  41. package/src/tigerbeetle/src/main.zig +32 -23
  42. package/src/tigerbeetle/src/message_bus.zig +25 -25
  43. package/src/tigerbeetle/src/message_pool.zig +17 -17
  44. package/src/tigerbeetle/src/simulator.zig +7 -12
  45. package/src/tigerbeetle/src/state_machine.zig +582 -1806
  46. package/src/tigerbeetle/src/storage.zig +12 -12
  47. package/src/tigerbeetle/src/test/accounting/auditor.zig +2 -2
  48. package/src/tigerbeetle/src/test/accounting/workload.zig +5 -5
  49. package/src/tigerbeetle/src/test/cluster.zig +8 -8
  50. package/src/tigerbeetle/src/test/conductor.zig +6 -5
  51. package/src/tigerbeetle/src/test/fuzz.zig +19 -0
  52. package/src/tigerbeetle/src/test/message_bus.zig +0 -2
  53. package/src/tigerbeetle/src/test/network.zig +5 -5
  54. package/src/tigerbeetle/src/test/state_checker.zig +2 -2
  55. package/src/tigerbeetle/src/test/storage.zig +54 -51
  56. package/src/tigerbeetle/src/test/storage_checker.zig +3 -3
  57. package/src/tigerbeetle/src/test/table.zig +226 -0
  58. package/src/tigerbeetle/src/time.zig +0 -1
  59. package/src/tigerbeetle/src/tracer.zig +402 -214
  60. package/src/tigerbeetle/src/unit_tests.zig +1 -0
  61. package/src/tigerbeetle/src/vsr/client.zig +5 -5
  62. package/src/tigerbeetle/src/vsr/clock.zig +9 -8
  63. package/src/tigerbeetle/src/vsr/journal.zig +47 -47
  64. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +13 -11
  65. package/src/tigerbeetle/src/vsr/replica.zig +56 -54
  66. package/src/tigerbeetle/src/vsr/replica_format.zig +8 -8
  67. package/src/tigerbeetle/src/vsr/superblock.zig +55 -55
  68. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +9 -9
  69. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +4 -3
  70. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +2 -0
  71. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +9 -6
  72. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +5 -5
  73. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +2 -0
  74. package/src/tigerbeetle/src/vsr.zig +20 -20
@@ -1 +1 @@
1
- cd58e7f1a46beef96d550cfb8423c01542980ff7f9832127e73ad2e5cd0e3a63 dist/client.node
1
+ 004fa5f957fa7933ae697abff26d8e6879ebef4257a380594a24c92d285b07d8 dist/client.node
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tigerbeetle-node",
3
- "version": "0.11.3",
3
+ "version": "0.11.5",
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
@@ -14,18 +14,23 @@ const CreateTransfersResult = tb.CreateTransfersResult;
14
14
 
15
15
  const Storage = @import("tigerbeetle/src/storage.zig").Storage;
16
16
  const StateMachine = @import("tigerbeetle/src/state_machine.zig").StateMachineType(Storage, .{
17
- .message_body_size_max = config.message_body_size_max,
17
+ .message_body_size_max = constants.message_body_size_max,
18
18
  });
19
19
  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 constants = @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
 
@@ -41,7 +46,7 @@ export fn napi_register_module_v1(env: c.napi_env, exports: c.napi_value) c.napi
41
46
  env,
42
47
  exports,
43
48
  "tick_ms",
44
- config.tick_ms,
49
+ constants.tick_ms,
45
50
  "failed to add tick_ms to exports",
46
51
  ) catch return null;
47
52
 
@@ -140,7 +145,7 @@ const Context = struct {
140
145
  context.message_pool = try MessagePool.init(allocator, .client);
141
146
  errdefer context.message_pool.deinit(allocator);
142
147
 
143
- context.addresses = try vsr.parse_addresses(allocator, addresses_raw, config.replicas_max);
148
+ context.addresses = try vsr.parse_addresses(allocator, addresses_raw, constants.replicas_max);
144
149
  errdefer allocator.free(context.addresses);
145
150
  assert(context.addresses.len > 0);
146
151
 
@@ -237,7 +242,7 @@ fn decode_events_from_array(
237
242
  if (array_length < 1) return translate.throw(env, "Batch must contain at least one event.");
238
243
 
239
244
  const body_length = @sizeOf(T) * array_length;
240
- if (@sizeOf(Header) + body_length > config.message_size_max) {
245
+ if (@sizeOf(Header) + body_length > constants.message_size_max) {
241
246
  return translate.throw(env, "Batch is larger than the maximum message size.");
242
247
  }
243
248
 
@@ -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 constants = @import("constants.zig");
5
5
 
6
6
  const log = std.log;
7
7
  pub const log_level: std.log.Level = .err;
@@ -14,7 +14,7 @@ const Storage = @import("storage.zig").Storage;
14
14
  const MessagePool = @import("message_pool.zig").MessagePool;
15
15
  const MessageBus = @import("message_bus.zig").MessageBusClient;
16
16
  const StateMachine = @import("state_machine.zig").StateMachineType(Storage, .{
17
- .message_body_size_max = config.message_body_size_max,
17
+ .message_body_size_max = constants.message_body_size_max,
18
18
  });
19
19
  const RingBuffer = @import("ring_buffer.zig").RingBuffer;
20
20
 
@@ -26,7 +26,7 @@ const tb = @import("tigerbeetle.zig");
26
26
  const batches_count = 100;
27
27
 
28
28
  const transfers_per_batch: u32 = @divExact(
29
- config.message_size_max - @sizeOf(vsr.Header),
29
+ constants.message_size_max - @sizeOf(vsr.Header),
30
30
  @sizeOf(tb.Transfer),
31
31
  );
32
32
  comptime {
@@ -78,7 +78,7 @@ pub fn main() !void {
78
78
 
79
79
  const client_id = std.crypto.random.int(u128);
80
80
  const cluster_id: u32 = 0;
81
- var address = [_]std.net.Address{try std.net.Address.parseIp4("127.0.0.1", config.port)};
81
+ var address = [_]std.net.Address{try std.net.Address.parseIp4("127.0.0.1", constants.port)};
82
82
 
83
83
  var io = try IO.init(32, 0);
84
84
  defer io.deinit();
@@ -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 constants = @import("../../constants.zig");
6
6
  const log = std.log.scoped(.tb_client_context);
7
7
 
8
8
  const util = @import("../../util.zig");
@@ -122,7 +122,7 @@ pub fn ContextType(
122
122
  context.addresses = vsr.parse_addresses(
123
123
  context.allocator,
124
124
  addresses,
125
- config.replicas_max,
125
+ constants.replicas_max,
126
126
  ) catch |err| return switch (err) {
127
127
  error.AddressLimitExceeded => error.AddressLimitExceeded,
128
128
  else => error.AddressInvalid,
@@ -165,7 +165,7 @@ pub fn ContextType(
165
165
  );
166
166
  errdefer context.client.deinit(context.allocator);
167
167
 
168
- context.messages_available = config.client_request_queue_max;
168
+ context.messages_available = constants.client_request_queue_max;
169
169
  context.on_completion_ctx = on_completion_ctx;
170
170
  context.on_completion_fn = on_completion_fn;
171
171
  context.implementation = .{
@@ -199,7 +199,7 @@ pub fn ContextType(
199
199
  pub fn run(self: *Context) void {
200
200
  while (!self.thread.signal.is_shutdown()) {
201
201
  self.tick();
202
- self.io.run_for_ns(config.tick_ms * std.time.ns_per_ms) catch |err| {
202
+ self.io.run_for_ns(constants.tick_ms * std.time.ns_per_ms) catch |err| {
203
203
  log.err("{}: IO.run() failed: {s}", .{
204
204
  self.client_id,
205
205
  @errorName(err),
@@ -226,7 +226,7 @@ pub fn ContextType(
226
226
  }
227
227
 
228
228
  // Make sure the packet.data wouldn't overflow a message:
229
- const writable = message.buffer[@sizeOf(Header)..][0..config.message_body_size_max];
229
+ const writable = message.buffer[@sizeOf(Header)..][0..constants.message_body_size_max];
230
230
  if (readable.len > writable.len) {
231
231
  return self.on_complete(packet, error.TooMuchData);
232
232
  }
@@ -267,7 +267,7 @@ pub fn ContextType(
267
267
  result: PacketError![]const u8,
268
268
  ) void {
269
269
  self.messages_available += 1;
270
- assert(self.messages_available <= config.client_request_queue_max);
270
+ assert(self.messages_available <= constants.client_request_queue_max);
271
271
 
272
272
  // Signal to resume sending requests that was waiting for available messages.
273
273
  if (self.messages_available == 1) self.thread.signal.notify();
@@ -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 constants = @import("../../constants.zig");
6
6
  const vsr = @import("../../vsr.zig");
7
7
  const Header = vsr.Header;
8
8
 
@@ -24,7 +24,7 @@ pub fn EchoClient(comptime StateMachine_: type, comptime MessageBus: type) type
24
24
  };
25
25
  };
26
26
 
27
- request_queue: RingBuffer(Self.Request, config.client_request_queue_max, .array) = .{},
27
+ request_queue: RingBuffer(Self.Request, constants.client_request_queue_max, .array) = .{},
28
28
  message_pool: *MessagePool,
29
29
 
30
30
  pub fn init(
@@ -1,7 +1,6 @@
1
1
  const std = @import("std");
2
2
  const assert = std.debug.assert;
3
3
 
4
- const config = @import("../../config.zig");
5
4
  const log = std.log.scoped(.tb_client_thread);
6
5
 
7
6
  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,11 +26,11 @@ 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 constants = @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, .{
32
- .message_body_size_max = config.message_body_size_max,
33
+ .message_body_size_max = constants.message_body_size_max,
33
34
  });
34
35
 
35
36
  const ContextType = @import("tb_client/context.zig").ContextType;
@@ -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,