tigerbeetle-node 0.11.5 → 0.11.7

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 (77) hide show
  1. package/dist/.client.node.sha256 +1 -1
  2. package/dist/index.d.ts +41 -42
  3. package/dist/index.js +41 -42
  4. package/dist/index.js.map +1 -1
  5. package/package.json +2 -2
  6. package/src/index.ts +0 -1
  7. package/src/tigerbeetle/scripts/benchmark.bat +7 -3
  8. package/src/tigerbeetle/scripts/benchmark.sh +2 -3
  9. package/src/tigerbeetle/scripts/install.bat +7 -0
  10. package/src/tigerbeetle/scripts/install.sh +2 -3
  11. package/src/tigerbeetle/src/benchmark.zig +3 -3
  12. package/src/tigerbeetle/src/config.zig +24 -3
  13. package/src/tigerbeetle/src/constants.zig +8 -5
  14. package/src/tigerbeetle/src/ewah.zig +6 -5
  15. package/src/tigerbeetle/src/ewah_fuzz.zig +1 -1
  16. package/src/tigerbeetle/src/io/darwin.zig +19 -0
  17. package/src/tigerbeetle/src/io/linux.zig +8 -0
  18. package/src/tigerbeetle/src/io/windows.zig +20 -2
  19. package/src/tigerbeetle/src/iops.zig +7 -1
  20. package/src/tigerbeetle/src/lsm/compaction.zig +27 -72
  21. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +10 -11
  22. package/src/tigerbeetle/src/lsm/grid.zig +267 -267
  23. package/src/tigerbeetle/src/lsm/groove.zig +3 -0
  24. package/src/tigerbeetle/src/lsm/level_iterator.zig +18 -1
  25. package/src/tigerbeetle/src/lsm/manifest.zig +29 -1
  26. package/src/tigerbeetle/src/lsm/manifest_level.zig +1 -0
  27. package/src/tigerbeetle/src/lsm/manifest_log.zig +5 -5
  28. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +19 -11
  29. package/src/tigerbeetle/src/lsm/merge_iterator.zig +106 -0
  30. package/src/tigerbeetle/src/lsm/posted_groove.zig +1 -0
  31. package/src/tigerbeetle/src/lsm/segmented_array.zig +1 -0
  32. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +26 -70
  33. package/src/tigerbeetle/src/lsm/table.zig +56 -0
  34. package/src/tigerbeetle/src/lsm/table_iterator.zig +29 -2
  35. package/src/tigerbeetle/src/lsm/table_mutable.zig +49 -15
  36. package/src/tigerbeetle/src/lsm/test.zig +10 -7
  37. package/src/tigerbeetle/src/lsm/tree.zig +27 -6
  38. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +302 -263
  39. package/src/tigerbeetle/src/message_pool.zig +2 -1
  40. package/src/tigerbeetle/src/simulator.zig +22 -84
  41. package/src/tigerbeetle/src/{test/accounting → state_machine}/auditor.zig +8 -8
  42. package/src/tigerbeetle/src/{test/accounting → state_machine}/workload.zig +108 -48
  43. package/src/tigerbeetle/src/state_machine.zig +20 -14
  44. package/src/tigerbeetle/src/storage.zig +58 -6
  45. package/src/tigerbeetle/src/test/cluster.zig +14 -11
  46. package/src/tigerbeetle/src/test/conductor.zig +2 -3
  47. package/src/tigerbeetle/src/test/id.zig +10 -0
  48. package/src/tigerbeetle/src/test/state_checker.zig +1 -1
  49. package/src/tigerbeetle/src/test/state_machine.zig +151 -46
  50. package/src/tigerbeetle/src/test/storage.zig +22 -1
  51. package/src/tigerbeetle/src/tigerbeetle.zig +0 -1
  52. package/src/tigerbeetle/src/tracer.zig +50 -28
  53. package/src/tigerbeetle/src/unit_tests.zig +11 -6
  54. package/src/tigerbeetle/src/vopr.zig +4 -4
  55. package/src/tigerbeetle/src/vsr/client.zig +5 -5
  56. package/src/tigerbeetle/src/vsr/clock.zig +2 -2
  57. package/src/tigerbeetle/src/vsr/journal.zig +647 -537
  58. package/src/tigerbeetle/src/vsr/replica.zig +333 -333
  59. package/src/tigerbeetle/src/vsr/replica_format.zig +7 -4
  60. package/src/tigerbeetle/src/vsr/superblock.zig +87 -39
  61. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +114 -93
  62. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +1 -1
  63. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +11 -8
  64. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +3 -3
  65. package/src/tigerbeetle/src/vsr.zig +60 -13
  66. package/src/tigerbeetle/src/c/tb_client/context.zig +0 -304
  67. package/src/tigerbeetle/src/c/tb_client/echo_client.zig +0 -108
  68. package/src/tigerbeetle/src/c/tb_client/packet.zig +0 -80
  69. package/src/tigerbeetle/src/c/tb_client/signal.zig +0 -286
  70. package/src/tigerbeetle/src/c/tb_client/thread.zig +0 -88
  71. package/src/tigerbeetle/src/c/tb_client.h +0 -221
  72. package/src/tigerbeetle/src/c/tb_client.zig +0 -177
  73. package/src/tigerbeetle/src/c/tb_client_header.zig +0 -218
  74. package/src/tigerbeetle/src/c/tb_client_header_test.zig +0 -135
  75. package/src/tigerbeetle/src/c/test.zig +0 -371
  76. package/src/tigerbeetle/src/cli.zig +0 -375
  77. package/src/tigerbeetle/src/main.zig +0 -245
@@ -1,286 +0,0 @@
1
- const std = @import("std");
2
- const builtin = @import("builtin");
3
- const IO = @import("../../io.zig").IO;
4
-
5
- const os = std.os;
6
- const assert = std.debug.assert;
7
- const Atomic = std.atomic.Atomic;
8
-
9
- const log = std.log.scoped(.tb_client_signal);
10
-
11
- /// A Signal is a way to trigger a registered callback on a tigerbeetle IO instance
12
- /// when notification occurs from another thread.
13
- /// It does this by using OS sockets (which are thread safe)
14
- /// to resolve IO.Completions on the tigerbeetle thread.
15
- pub const Signal = struct {
16
- io: *IO,
17
- server_socket: os.socket_t,
18
- accept_socket: os.socket_t,
19
- connect_socket: os.socket_t,
20
-
21
- completion: IO.Completion,
22
- recv_buffer: [1]u8,
23
- send_buffer: [1]u8,
24
-
25
- on_signal_fn: fn (*Signal) void,
26
- state: Atomic(enum(u8) {
27
- running,
28
- waiting,
29
- notified,
30
- shutdown,
31
- }),
32
-
33
- pub fn init(self: *Signal, io: *IO, on_signal_fn: fn (*Signal) void) !void {
34
- self.io = io;
35
- self.server_socket = os.socket(
36
- os.AF.INET,
37
- os.SOCK.STREAM | os.SOCK.NONBLOCK,
38
- os.IPPROTO.TCP,
39
- ) catch |err| {
40
- log.err("failed to create signal server socket: {}", .{err});
41
- return switch (err) {
42
- error.PermissionDenied, error.ProtocolNotSupported, error.SocketTypeNotSupported, error.AddressFamilyNotSupported, error.ProtocolFamilyNotAvailable => error.NetworkSubsystemFailed,
43
- error.ProcessFdQuotaExceeded, error.SystemFdQuotaExceeded, error.SystemResources => error.SystemResources,
44
- error.Unexpected => error.Unexpected,
45
- };
46
- };
47
- errdefer os.closeSocket(self.server_socket);
48
-
49
- // Windows requires that the socket is bound before listening
50
- if (builtin.target.os.tag == .windows) {
51
- const addr = std.net.Address.initIp4(.{ 127, 0, 0, 1 }, 0); // zero port lets the OS choose
52
- os.bind(self.server_socket, &addr.any, addr.getOsSockLen()) catch |err| {
53
- log.err("failed to bind the server socket to a local random port: {}", .{err});
54
- return switch (err) {
55
- error.AccessDenied => unreachable,
56
- error.AlreadyBound => unreachable,
57
- error.AddressInUse, error.AddressNotAvailable => unreachable,
58
- error.SymLinkLoop => unreachable,
59
- error.NameTooLong => unreachable,
60
- error.FileNotFound, error.FileDescriptorNotASocket => unreachable,
61
- error.NotDir => unreachable,
62
- error.ReadOnlyFileSystem => unreachable,
63
- error.SystemResources, error.NetworkSubsystemFailed, error.Unexpected => |e| e,
64
- };
65
- };
66
- }
67
-
68
- os.listen(self.server_socket, 1) catch |err| {
69
- log.err("failed to listen on signal server socket: {}", .{err});
70
- return switch (err) {
71
- error.AddressInUse => unreachable,
72
- error.FileDescriptorNotASocket => unreachable,
73
- error.AlreadyConnected => unreachable,
74
- error.SocketNotBound => unreachable,
75
- error.OperationNotSupported, error.NetworkSubsystemFailed => error.NetworkSubsystemFailed,
76
- error.SystemResources => error.SystemResources,
77
- error.Unexpected => error.Unexpected,
78
- };
79
- };
80
-
81
- var addr = std.net.Address.initIp4(undefined, undefined);
82
- var addr_len = addr.getOsSockLen();
83
- os.getsockname(self.server_socket, &addr.any, &addr_len) catch |err| {
84
- log.err("failed to get address of signal server socket: {}", .{err});
85
- return switch (err) {
86
- error.SocketNotBound => unreachable,
87
- error.FileDescriptorNotASocket => unreachable,
88
- error.SystemResources => error.SystemResources,
89
- error.NetworkSubsystemFailed => error.NetworkSubsystemFailed,
90
- error.Unexpected => error.Unexpected,
91
- };
92
- };
93
-
94
- self.connect_socket = self.io.open_socket(
95
- os.AF.INET,
96
- os.SOCK.STREAM,
97
- os.IPPROTO.TCP,
98
- ) catch |err| {
99
- log.err("failed to create signal connect socket: {}", .{err});
100
- return error.Unexpected;
101
- };
102
- errdefer os.closeSocket(self.connect_socket);
103
-
104
- // Tracks when the connect_socket connects to the server_socket
105
- const DoConnect = struct {
106
- result: IO.ConnectError!void = undefined,
107
- completion: IO.Completion = undefined,
108
- is_connected: bool = false,
109
-
110
- fn on_connect(
111
- do_connect: *@This(),
112
- _completion: *IO.Completion,
113
- result: IO.ConnectError!void,
114
- ) void {
115
- assert(&do_connect.completion == _completion);
116
- assert(!do_connect.is_connected);
117
- do_connect.is_connected = true;
118
- do_connect.result = result;
119
- }
120
- };
121
-
122
- var do_connect = DoConnect{};
123
- self.io.connect(
124
- *DoConnect,
125
- &do_connect,
126
- DoConnect.on_connect,
127
- &do_connect.completion,
128
- self.connect_socket,
129
- addr,
130
- );
131
-
132
- // Wait for the connect_socket to connect to the server_socket.
133
- self.accept_socket = IO.INVALID_SOCKET;
134
- while (!do_connect.is_connected or self.accept_socket == IO.INVALID_SOCKET) {
135
- self.io.tick() catch |err| {
136
- log.err("failed to tick IO when setting up signal: {}", .{err});
137
- return error.Unexpected;
138
- };
139
-
140
- // Try to accept the connection from the connect_socket as the accept_socket
141
- if (self.accept_socket == IO.INVALID_SOCKET) {
142
- self.accept_socket = os.accept(self.server_socket, null, null, 0) catch |e| switch (e) {
143
- error.WouldBlock => continue,
144
- error.ConnectionAborted => unreachable,
145
- error.ConnectionResetByPeer => unreachable,
146
- error.FileDescriptorNotASocket => unreachable,
147
- error.ProcessFdQuotaExceeded, error.SystemFdQuotaExceeded, error.SystemResources => return error.SystemResources,
148
- error.SocketNotListening => unreachable,
149
- error.BlockedByFirewall => unreachable,
150
- error.ProtocolFailure, error.OperationNotSupported, error.NetworkSubsystemFailed => return error.NetworkSubsystemFailed,
151
- error.Unexpected => return error.Unexpected,
152
- };
153
- }
154
- }
155
-
156
- _ = do_connect.result catch |err| {
157
- log.err("failed to connect on signal client socket: {}", .{err});
158
- return error.Unexpected;
159
- };
160
-
161
- assert(do_connect.is_connected);
162
- assert(self.accept_socket != IO.INVALID_SOCKET);
163
- assert(self.connect_socket != IO.INVALID_SOCKET);
164
-
165
- self.completion = undefined;
166
- self.recv_buffer = undefined;
167
- self.send_buffer = undefined;
168
-
169
- self.state = @TypeOf(self.state).init(.running);
170
- self.on_signal_fn = on_signal_fn;
171
- self.wait();
172
- }
173
-
174
- pub fn deinit(self: *Signal) void {
175
- os.closeSocket(self.server_socket);
176
- os.closeSocket(self.accept_socket);
177
- os.closeSocket(self.connect_socket);
178
- }
179
-
180
- /// Schedules the on_signal callback to be invoked on the IO thread.
181
- /// Safe to call from multiple threads.
182
- pub fn notify(self: *Signal) void {
183
- if (self.state.swap(.notified, .Release) == .waiting) {
184
- self.wake();
185
- }
186
- }
187
-
188
- /// Stops the signal from firing on_signal callbacks on the IO thread.
189
- /// Safe to call from multiple threads.
190
- pub fn shutdown(self: *Signal) void {
191
- if (self.state.swap(.shutdown, .Release) == .waiting) {
192
- self.wake();
193
- }
194
- }
195
-
196
- /// Return true if the Signal was marked disabled and should no longer fire on_signal callbacks.
197
- /// Safe to call from multiple threads.
198
- pub fn is_shutdown(self: *const Signal) bool {
199
- return self.state.load(.Acquire) == .shutdown;
200
- }
201
-
202
- fn wake(self: *Signal) void {
203
- assert(self.accept_socket != IO.INVALID_SOCKET);
204
- self.send_buffer[0] = 0;
205
-
206
- // TODO: use os.send() instead when it gets fixed for windows
207
- if (builtin.target.os.tag != .windows) {
208
- _ = os.send(self.accept_socket, &self.send_buffer, 0) catch unreachable;
209
- return;
210
- }
211
-
212
- const buf: []const u8 = &self.send_buffer;
213
- const rc = os.windows.sendto(self.accept_socket, buf.ptr, buf.len, 0, null, 0);
214
- assert(rc != os.windows.ws2_32.SOCKET_ERROR);
215
- }
216
-
217
- fn wait(self: *Signal) void {
218
- const state = self.state.compareAndSwap(
219
- .running,
220
- .waiting,
221
- .Acquire,
222
- .Acquire,
223
- ) orelse return self.io.recv(
224
- *Signal,
225
- self,
226
- on_recv,
227
- &self.completion,
228
- self.connect_socket,
229
- &self.recv_buffer,
230
- );
231
-
232
- switch (state) {
233
- .running => unreachable, // Not possible due to CAS semantics.
234
- .waiting => unreachable, // We should be the only ones who could've started waiting.
235
- .notified => {}, // A thread woke us up before we started waiting so reschedule below.
236
- .shutdown => return, // A thread shut down the signal before we started waiting.
237
- }
238
-
239
- self.io.timeout(
240
- *Signal,
241
- self,
242
- on_timeout,
243
- &self.completion,
244
- 0, // zero-timeout functions as a yield
245
- );
246
- }
247
-
248
- fn on_recv(
249
- self: *Signal,
250
- completion: *IO.Completion,
251
- result: IO.RecvError!usize,
252
- ) void {
253
- assert(completion == &self.completion);
254
- _ = result catch |err| std.debug.panic("Signal recv error: {}", .{err});
255
- self.on_signal();
256
- }
257
-
258
- fn on_timeout(
259
- self: *Signal,
260
- completion: *IO.Completion,
261
- result: IO.TimeoutError!void,
262
- ) void {
263
- assert(completion == &self.completion);
264
- _ = result catch |err| std.debug.panic("Signal timeout error: {}", .{err});
265
- self.on_signal();
266
- }
267
-
268
- fn on_signal(self: *Signal) void {
269
- const state = self.state.compareAndSwap(
270
- .notified,
271
- .running,
272
- .Acquire,
273
- .Acquire,
274
- ) orelse {
275
- (self.on_signal_fn)(self);
276
- return self.wait();
277
- };
278
-
279
- switch (state) {
280
- .running => unreachable, // Multiple racing calls to on_signal().
281
- .waiting => unreachable, // on_signal() called without transitioning to a waking state.
282
- .notified => unreachable, // Not possible due to CAS semantics.
283
- .shutdown => return, // A thread shut down the signal before we started running.
284
- }
285
- }
286
- };
@@ -1,88 +0,0 @@
1
- const std = @import("std");
2
- const assert = std.debug.assert;
3
-
4
- const log = std.log.scoped(.tb_client_thread);
5
-
6
- const Packet = @import("packet.zig").Packet;
7
- const Signal = @import("signal.zig").Signal;
8
-
9
- pub fn ThreadType(
10
- comptime Context: type,
11
- ) type {
12
- return struct {
13
- const Self = @This();
14
-
15
- context: *Context,
16
-
17
- retry: Packet.List,
18
- submitted: Packet.Stack,
19
-
20
- signal: Signal,
21
- thread: std.Thread,
22
-
23
- pub fn init(
24
- self: *Self,
25
- context: *Context,
26
- ) !void {
27
- self.context = context;
28
- self.retry = .{};
29
- self.submitted = .{};
30
-
31
- log.debug("{}: init: initializing signal", .{context.client_id});
32
- try self.signal.init(&context.io, Self.on_signal);
33
- errdefer self.signal.deinit();
34
-
35
- log.debug("{}: init: spawning thread", .{context.client_id});
36
- self.thread = std.Thread.spawn(.{}, Context.run, .{context}) catch |err| {
37
- log.err("{}: failed to spawn thread: {s}", .{
38
- context.client_id,
39
- @errorName(err),
40
- });
41
- return switch (err) {
42
- error.Unexpected => error.Unexpected,
43
- error.OutOfMemory => error.OutOfMemory,
44
- error.SystemResources, error.ThreadQuotaExceeded, error.LockedMemoryLimitExceeded => error.SystemResources,
45
- };
46
- };
47
- }
48
-
49
- pub fn deinit(self: *Self) void {
50
- self.signal.shutdown();
51
- self.thread.join();
52
- self.signal.deinit();
53
-
54
- self.* = undefined;
55
- }
56
-
57
- pub fn submit(self: *Self, list: Packet.List) void {
58
- if (list.peek() == null) return;
59
- self.submitted.push(list);
60
- self.signal.notify();
61
- }
62
-
63
- fn on_signal(signal: *Signal) void {
64
- const self = @fieldParentPtr(Self, "signal", signal);
65
- self.context.tick();
66
-
67
- // Consume all of retry here to avoid infinite loop
68
- // if the code below pushes to self.retry while we're dequeueing.
69
- var pending = self.retry;
70
- self.retry = .{};
71
-
72
- // The loop below can exit early without processing all of pending
73
- // if available_messages becomes zero.
74
- // In such a case we need to restore self.retry we consumed above
75
- // with those that weren't processed.
76
- defer {
77
- pending.push(self.retry);
78
- self.retry = pending;
79
- }
80
-
81
- // Process packets from either pending or submitted as long as we have messages.
82
- while (self.context.messages_available > 0) {
83
- const packet = pending.pop() orelse self.submitted.pop() orelse break;
84
- self.context.request(packet);
85
- }
86
- }
87
- };
88
- }
@@ -1,221 +0,0 @@
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
-
9
- #include <stddef.h>
10
- #include <stdint.h>
11
- #include <stdbool.h>
12
-
13
- typedef __uint128_t tb_uint128_t;
14
-
15
- typedef enum TB_ACCOUNT_FLAGS {
16
- TB_ACCOUNT_LINKED = 1 << 0,
17
- TB_ACCOUNT_DEBITS_MUST_NOT_EXCEED_CREDITS = 1 << 1,
18
- TB_ACCOUNT_CREDITS_MUST_NOT_EXCEED_DEBITS = 1 << 2,
19
- } TB_ACCOUNT_FLAGS;
20
-
21
- typedef struct tb_account_t {
22
- tb_uint128_t id;
23
- tb_uint128_t user_data;
24
- uint8_t reserved[48];
25
- uint32_t ledger;
26
- uint16_t code;
27
- uint16_t flags;
28
- uint64_t debits_pending;
29
- uint64_t debits_posted;
30
- uint64_t credits_pending;
31
- uint64_t credits_posted;
32
- uint64_t timestamp;
33
- } tb_account_t;
34
-
35
- typedef enum TB_TRANSFER_FLAGS {
36
- TB_TRANSFER_LINKED = 1 << 0,
37
- TB_TRANSFER_PENDING = 1 << 1,
38
- TB_TRANSFER_POST_PENDING_TRANSFER = 1 << 2,
39
- TB_TRANSFER_VOID_PENDING_TRANSFER = 1 << 3,
40
- } TB_TRANSFER_FLAGS;
41
-
42
- typedef struct tb_transfer_t {
43
- tb_uint128_t id;
44
- tb_uint128_t debit_account_id;
45
- tb_uint128_t credit_account_id;
46
- tb_uint128_t user_data;
47
- tb_uint128_t reserved;
48
- tb_uint128_t pending_id;
49
- uint64_t timeout;
50
- uint32_t ledger;
51
- uint16_t code;
52
- uint16_t flags;
53
- uint64_t amount;
54
- uint64_t timestamp;
55
- } tb_transfer_t;
56
-
57
- typedef enum TB_CREATE_ACCOUNT_RESULT {
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,
77
- } TB_CREATE_ACCOUNT_RESULT;
78
-
79
- typedef enum TB_CREATE_TRANSFER_RESULT {
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,
136
- } TB_CREATE_TRANSFER_RESULT;
137
-
138
- typedef struct tb_create_accounts_result_t {
139
- uint32_t index;
140
- uint32_t result;
141
- } tb_create_accounts_result_t;
142
-
143
- typedef struct tb_create_transfers_result_t {
144
- uint32_t index;
145
- uint32_t result;
146
- } tb_create_transfers_result_t;
147
-
148
- typedef enum TB_OPERATION {
149
- TB_OPERATION_CREATE_ACCOUNTS = 3,
150
- TB_OPERATION_CREATE_TRANSFERS = 4,
151
- TB_OPERATION_LOOKUP_ACCOUNTS = 5,
152
- TB_OPERATION_LOOKUP_TRANSFERS = 6,
153
- } TB_OPERATION;
154
-
155
- typedef enum TB_PACKET_STATUS {
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,
160
- } TB_PACKET_STATUS;
161
-
162
- typedef struct tb_packet_t {
163
- struct tb_packet_t* next;
164
- void* user_data;
165
- uint8_t operation;
166
- uint8_t status;
167
- uint32_t data_size;
168
- void* data;
169
- } tb_packet_t;
170
-
171
- typedef struct tb_packet_list_t {
172
- struct tb_packet_t* head;
173
- struct tb_packet_t* tail;
174
- } tb_packet_list_t;
175
-
176
- typedef void* tb_client_t;
177
-
178
- typedef enum TB_STATUS {
179
- TB_STATUS_SUCCESS = 0,
180
- TB_STATUS_UNEXPECTED = 1,
181
- TB_STATUS_OUT_OF_MEMORY = 2,
182
- TB_STATUS_ADDRESS_INVALID = 3,
183
- TB_STATUS_ADDRESS_LIMIT_EXCEEDED = 4,
184
- TB_STATUS_PACKETS_COUNT_INVALID = 5,
185
- TB_STATUS_SYSTEM_RESOURCES = 6,
186
- TB_STATUS_NETWORK_SUBSYSTEM = 7,
187
- } TB_STATUS;
188
-
189
- TB_STATUS tb_client_init(
190
- tb_client_t* out_client,
191
- struct tb_packet_list_t* out_packets,
192
- uint32_t cluster_id,
193
- const char* address_ptr,
194
- uint32_t address_len,
195
- uint32_t packets_count,
196
- uintptr_t on_completion_ctx,
197
- void (*on_completion_fn)(uintptr_t, tb_client_t, tb_packet_t*, const uint8_t*, uint32_t)
198
- );
199
-
200
- TB_STATUS tb_client_init_echo(
201
- tb_client_t* out_client,
202
- struct tb_packet_list_t* out_packets,
203
- uint32_t cluster_id,
204
- const char* address_ptr,
205
- uint32_t address_len,
206
- uint32_t packets_count,
207
- uintptr_t on_completion_ctx,
208
- void (*on_completion_fn)(uintptr_t, tb_client_t, tb_packet_t*, const uint8_t*, uint32_t)
209
- );
210
-
211
- void tb_client_submit(
212
- tb_client_t client,
213
- struct tb_packet_list_t* packets
214
- );
215
-
216
- void tb_client_deinit(
217
- tb_client_t client
218
- );
219
-
220
- #endif // TB_CLIENT_H
221
-