tigerbeetle-node 0.5.1 → 0.8.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 (56) hide show
  1. package/README.md +88 -69
  2. package/dist/benchmark.js +96 -94
  3. package/dist/benchmark.js.map +1 -1
  4. package/dist/index.d.ts +82 -82
  5. package/dist/index.js +74 -93
  6. package/dist/index.js.map +1 -1
  7. package/dist/test.js +134 -111
  8. package/dist/test.js.map +1 -1
  9. package/package.json +3 -2
  10. package/src/benchmark.ts +114 -118
  11. package/src/index.ts +102 -111
  12. package/src/node.zig +54 -62
  13. package/src/test.ts +146 -125
  14. package/src/tigerbeetle/scripts/benchmark.bat +46 -0
  15. package/src/tigerbeetle/scripts/benchmark.sh +5 -0
  16. package/src/tigerbeetle/scripts/install_zig.bat +2 -2
  17. package/src/tigerbeetle/scripts/install_zig.sh +3 -3
  18. package/src/tigerbeetle/scripts/vopr.sh +2 -2
  19. package/src/tigerbeetle/src/benchmark.zig +65 -102
  20. package/src/tigerbeetle/src/cli.zig +39 -18
  21. package/src/tigerbeetle/src/config.zig +27 -12
  22. package/src/tigerbeetle/src/demo.zig +1 -14
  23. package/src/tigerbeetle/src/demo_01_create_accounts.zig +10 -10
  24. package/src/tigerbeetle/src/demo_03_create_transfers.zig +3 -1
  25. package/src/tigerbeetle/src/{demo_04_create_transfers_two_phase_commit.zig → demo_04_create_pending_transfers.zig} +12 -6
  26. package/src/tigerbeetle/src/demo_05_post_pending_transfers.zig +37 -0
  27. package/src/tigerbeetle/src/demo_06_void_pending_transfers.zig +24 -0
  28. package/src/tigerbeetle/src/demo_07_lookup_transfers.zig +1 -1
  29. package/src/tigerbeetle/src/io/benchmark.zig +24 -49
  30. package/src/tigerbeetle/src/io/darwin.zig +175 -44
  31. package/src/tigerbeetle/src/io/linux.zig +177 -72
  32. package/src/tigerbeetle/src/io/test.zig +61 -39
  33. package/src/tigerbeetle/src/io/windows.zig +1161 -0
  34. package/src/tigerbeetle/src/io.zig +2 -0
  35. package/src/tigerbeetle/src/main.zig +14 -9
  36. package/src/tigerbeetle/src/message_bus.zig +56 -74
  37. package/src/tigerbeetle/src/message_pool.zig +63 -57
  38. package/src/tigerbeetle/src/ring_buffer.zig +7 -0
  39. package/src/tigerbeetle/src/simulator.zig +4 -4
  40. package/src/tigerbeetle/src/state_machine.zig +1804 -797
  41. package/src/tigerbeetle/src/storage.zig +0 -230
  42. package/src/tigerbeetle/src/test/cluster.zig +3 -6
  43. package/src/tigerbeetle/src/test/message_bus.zig +4 -3
  44. package/src/tigerbeetle/src/test/network.zig +13 -16
  45. package/src/tigerbeetle/src/test/state_checker.zig +3 -2
  46. package/src/tigerbeetle/src/tigerbeetle.zig +108 -101
  47. package/src/tigerbeetle/src/time.zig +58 -11
  48. package/src/tigerbeetle/src/vsr/client.zig +18 -32
  49. package/src/tigerbeetle/src/vsr/clock.zig +1 -1
  50. package/src/tigerbeetle/src/vsr/journal.zig +2 -6
  51. package/src/tigerbeetle/src/vsr/replica.zig +152 -175
  52. package/src/tigerbeetle/src/vsr.zig +263 -5
  53. package/src/translate.zig +10 -0
  54. package/src/tigerbeetle/src/demo_05_accept_transfers.zig +0 -23
  55. package/src/tigerbeetle/src/demo_06_reject_transfers.zig +0 -17
  56. package/src/tigerbeetle/src/format_test.zig +0 -69
package/src/index.ts CHANGED
@@ -24,13 +24,13 @@ export type Account = {
24
24
  id: bigint // u128
25
25
  user_data: bigint // u128
26
26
  reserved: Buffer // [48]u8
27
- unit: number // u16, unit of value
27
+ ledger: number // u32, ledger of value
28
28
  code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)
29
- flags: number // u32
30
- debits_reserved: bigint // u64
31
- debits_accepted: bigint // u64
32
- credits_reserved: bigint // u64
33
- credits_accepted: bigint // u64
29
+ flags: number // u16
30
+ debits_pending: bigint // u64
31
+ debits_posted: bigint // u64
32
+ credits_pending: bigint // u64
33
+ credits_posted: bigint // u64
34
34
  timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server
35
35
  }
36
36
 
@@ -41,17 +41,33 @@ export enum AccountFlags {
41
41
  }
42
42
 
43
43
  export enum CreateAccountError {
44
+ // ok = 0 (No Error)
44
45
  linked_event_failed = 1,
45
- exists,
46
- exists_with_different_user_data,
47
- exists_with_different_reserved_field,
48
- exists_with_different_unit,
49
- exists_with_different_code,
50
- exists_with_different_flags,
46
+
47
+ reserved_flag,
48
+ reserved_field,
49
+
50
+ id_must_not_be_zero,
51
+ ledger_must_not_be_zero,
52
+ code_must_not_be_zero,
53
+
54
+ mutually_exclusive_flags,
55
+
56
+ overflows_debits,
57
+ overflows_credits,
58
+
51
59
  exceeds_credits,
52
60
  exceeds_debits,
53
- reserved_field,
54
- reserved_flag_padding,
61
+
62
+ exists_with_different_flags,
63
+ exists_with_different_user_data,
64
+ exists_with_different_ledger,
65
+ exists_with_different_code,
66
+ exists_with_different_debits_pending,
67
+ exists_with_different_debits_posted,
68
+ exists_with_different_credits_pending,
69
+ exists_with_different_credits_posted,
70
+ exists,
55
71
  }
56
72
 
57
73
  export type CreateAccountsError = {
@@ -64,102 +80,107 @@ export type Transfer = {
64
80
  debit_account_id: bigint, // u128
65
81
  credit_account_id: bigint, // u128
66
82
  user_data: bigint, // u128
67
- reserved: Buffer, // [32]u8
68
- timeout: bigint, // u64, in nano-seconds
69
- code: number, // u32 accounting system code to describe the type of transfer (e.g. settlement)
70
- flags: number, // u32
83
+ reserved: bigint, // u128
84
+ pending_id: bigint, // u128
85
+ timeout: bigint, // u64, In nanoseconds.
86
+ ledger: number // u32, The ledger of value.
87
+ code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).
88
+ flags: number, // u16
71
89
  amount: bigint, // u64,
72
- timestamp: bigint, // u64, Set this to 0n - the actual value will be set by TigerBeetle server
90
+ timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.
73
91
  }
74
92
 
75
93
  export enum TransferFlags {
76
94
  linked = (1 << 0),
77
- two_phase_commit = (1 << 1),
78
- condition = (1 << 2) // whether or not a condition will be supplied
95
+ pending = (1 << 1),
96
+ post_pending_transfer = (1 << 2),
97
+ void_pending_transfer = (1 << 3)
79
98
  }
80
99
 
81
100
  export enum CreateTransferError {
101
+ // ok = 0 (No Error)
82
102
  linked_event_failed = 1,
83
- exists,
103
+
104
+ reserved_flag,
105
+ reserved_field,
106
+
107
+ id_must_not_be_zero,
108
+ debit_account_id_must_not_be_zero,
109
+ credit_account_id_must_not_be_zero,
110
+ accounts_must_be_different,
111
+
112
+ pending_id_must_be_zero,
113
+ pending_transfer_must_timeout,
114
+
115
+ ledger_must_not_be_zero,
116
+ code_must_not_be_zero,
117
+ amount_must_not_be_zero,
118
+
119
+ debit_account_not_found,
120
+ credit_account_not_found,
121
+
122
+ accounts_must_have_the_same_ledger,
123
+ transfer_must_have_the_same_ledger_as_accounts,
124
+
125
+ exists_with_different_flags,
84
126
  exists_with_different_debit_account_id,
85
127
  exists_with_different_credit_account_id,
86
128
  exists_with_different_user_data,
87
- exists_with_different_reserved_field,
129
+ exists_with_different_pending_id,
130
+ exists_with_different_timeout,
88
131
  exists_with_different_code,
89
132
  exists_with_different_amount,
90
- exists_with_different_timeout,
91
- exists_with_different_flags,
92
- exists_and_already_committed_and_accepted,
93
- exists_and_already_committed_and_rejected,
94
- reserved_field,
95
- reserved_flag_padding,
96
- debit_account_not_found,
97
- credit_account_not_found,
98
- accounts_are_the_same,
99
- accounts_have_different_units,
100
- amount_is_zero,
133
+ exists,
134
+
135
+ overflows_debits_pending,
136
+ overflows_credits_pending,
137
+ overflows_debits_posted,
138
+ overflows_credits_posted,
139
+ overflows_debits,
140
+ overflows_credits,
141
+
101
142
  exceeds_credits,
102
143
  exceeds_debits,
103
- two_phase_commit_must_timeout,
104
- timeout_reserved_for_two_phase_commit,
105
- }
106
144
 
107
- export type CreateTransfersError = {
108
- index: number,
109
- code: CreateTransferError,
110
- }
145
+ cannot_post_and_void_pending_transfer,
146
+ pending_transfer_cannot_post_or_void_another,
147
+ timeout_reserved_for_pending_transfer,
111
148
 
112
- export type Commit = {
113
- id: bigint, // u128
114
- reserved: Buffer, // [32]u8
115
- code: number, // u32 accounting system code describing the reason for accept/reject
116
- flags: number, // u32
117
- timestamp: bigint, // u64, Set this to 0n - the actual value will be set by TigerBeetle server
118
- }
149
+ pending_id_must_not_be_zero,
150
+ pending_id_must_be_different,
119
151
 
120
- export enum CommitFlags {
121
- linked = (1 << 0),
122
- reject = (1 << 1),
123
- preimage = (1 << 2) // whether or not a pre-image will be supplied
124
- }
152
+ pending_transfer_not_found,
153
+ pending_transfer_not_pending,
125
154
 
126
- export enum CommitTransferError {
127
- linked_event_failed = 1,
128
- reserved_field,
129
- reserved_flag_padding,
130
- transfer_not_found,
131
- transfer_not_two_phase_commit,
132
- transfer_expired,
133
- already_committed,
134
- already_committed_but_accepted,
135
- already_committed_but_rejected,
136
- debit_account_not_found,
137
- credit_account_not_found,
138
- debit_amount_was_not_reserved,
139
- credit_amount_was_not_reserved,
140
- exceeds_credits,
141
- exceeds_debits,
142
- condition_requires_preimage,
143
- preimage_requires_condition,
144
- preimage_invalid,
155
+ pending_transfer_has_different_debit_account_id,
156
+ pending_transfer_has_different_credit_account_id,
157
+ pending_transfer_has_different_ledger,
158
+ pending_transfer_has_different_code,
159
+
160
+ exceeds_pending_transfer_amount,
161
+ pending_transfer_has_different_amount,
162
+
163
+ pending_transfer_already_posted,
164
+ pending_transfer_already_voided,
165
+
166
+ pending_transfer_expired,
145
167
  }
146
168
 
147
- export type CommitTransfersError = {
169
+ export type CreateTransfersError = {
148
170
  index: number,
149
- code: CommitTransferError,
171
+ code: CreateTransferError,
150
172
  }
151
173
 
152
174
  export type AccountID = bigint // u128
153
175
  export type TransferID = bigint // u128
154
176
 
155
- export type Event = Account | Transfer | Commit | AccountID | TransferID
156
- export type Result = CreateAccountsError | CreateTransfersError | CommitTransfersError | Account | Transfer
177
+ export type Event = Account | Transfer | AccountID | TransferID
178
+ export type Result = CreateAccountsError | CreateTransfersError | Account | Transfer
157
179
  export type ResultCallback = (error: undefined | Error, results: Result[]) => void
158
180
 
159
181
  export enum Operation {
160
182
  CREATE_ACCOUNT = 3,
161
183
  CREATE_TRANSFER,
162
- COMMIT_TRANSFER,
163
184
  ACCOUNT_LOOKUP,
164
185
  TRANSFER_LOOKUP
165
186
  }
@@ -167,7 +188,6 @@ export enum Operation {
167
188
  export interface Client {
168
189
  createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>
169
190
  createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>
170
- commitTransfers: (batch: Commit[]) => Promise<CommitTransfersError[]>
171
191
  lookupAccounts: (batch: AccountID[]) => Promise<Account[]>
172
192
  lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>
173
193
  request: (operation: Operation, batch: Event[], callback: ResultCallback) => void
@@ -192,13 +212,12 @@ const isSameArgs = (args: InitArgs): boolean => {
192
212
  }
193
213
  })
194
214
 
195
- return args.cluster_id === _args.cluster_id &&
196
- isSameReplicas
215
+ return args.cluster_id === _args.cluster_id && isSameReplicas
197
216
  }
198
217
 
199
218
  let _client: Client | undefined = undefined
200
219
  let _interval: NodeJS.Timeout | undefined = undefined
201
- // here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
220
+ // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
202
221
  let _pinged = false
203
222
  // TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.
204
223
  export function createClient (args: InitArgs): Client {
@@ -226,7 +245,7 @@ export function createClient (args: InitArgs): Client {
226
245
  }
227
246
 
228
247
  const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {
229
- // here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
248
+ // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
230
249
  if (!_pinged) {
231
250
  await new Promise<void>(resolve => {
232
251
  setTimeout(() => {
@@ -253,7 +272,7 @@ export function createClient (args: InitArgs): Client {
253
272
  }
254
273
 
255
274
  const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {
256
- // here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
275
+ // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
257
276
  if (!_pinged) {
258
277
  await new Promise<void>(resolve => {
259
278
  setTimeout(() => {
@@ -279,33 +298,6 @@ export function createClient (args: InitArgs): Client {
279
298
  })
280
299
  }
281
300
 
282
- const commitTransfers = async (batch: Commit[]): Promise<CommitTransfersError[]> => {
283
- // here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.
284
- if (!_pinged) {
285
- await new Promise<void>(resolve => {
286
- setTimeout(() => {
287
- _pinged = true
288
- resolve()
289
- }, 600)
290
- })
291
- }
292
- return new Promise((resolve, reject) => {
293
- const callback = (error: undefined | Error, results: CommitTransfersError[]) => {
294
- if (error) {
295
- reject(error)
296
- return
297
- }
298
- resolve(results)
299
- }
300
-
301
- try {
302
- binding.request(context, Operation.COMMIT_TRANSFER, batch, callback)
303
- } catch (error) {
304
- reject(error)
305
- }
306
- })
307
- }
308
-
309
301
  const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {
310
302
  return new Promise((resolve, reject) => {
311
303
  const callback = (error: undefined | Error, results: Account[]) => {
@@ -353,7 +345,6 @@ export function createClient (args: InitArgs): Client {
353
345
  _client = {
354
346
  createAccounts,
355
347
  createTransfers,
356
- commitTransfers,
357
348
  lookupAccounts,
358
349
  lookupTransfers,
359
350
  request,
package/src/node.zig CHANGED
@@ -9,11 +9,8 @@ const Account = tb.Account;
9
9
  const AccountFlags = tb.AccountFlags;
10
10
  const Transfer = tb.Transfer;
11
11
  const TransferFlags = tb.TransferFlags;
12
- const Commit = tb.Commit;
13
- const CommitFlags = tb.CommitFlags;
14
12
  const CreateAccountsResult = tb.CreateAccountsResult;
15
13
  const CreateTransfersResult = tb.CreateTransfersResult;
16
- const CommitTransfersResult = tb.CommitTransfersResult;
17
14
 
18
15
  const StateMachine = @import("tigerbeetle/src/state_machine.zig").StateMachine;
19
16
  const Operation = StateMachine.Operation;
@@ -184,22 +181,17 @@ fn validate_timestamp(env: c.napi_env, object: c.napi_value) !u64 {
184
181
 
185
182
  fn decode_from_object(comptime T: type, env: c.napi_env, object: c.napi_value) !T {
186
183
  return switch (T) {
187
- Commit => Commit{
188
- .id = try translate.u128_from_object(env, object, "id"),
189
- .reserved = try translate.bytes_from_object(env, object, 32, "reserved"),
190
- .code = try translate.u32_from_object(env, object, "code"),
191
- .flags = @bitCast(CommitFlags, try translate.u32_from_object(env, object, "flags")),
192
- .timestamp = try validate_timestamp(env, object),
193
- },
194
184
  Transfer => Transfer{
195
185
  .id = try translate.u128_from_object(env, object, "id"),
196
186
  .debit_account_id = try translate.u128_from_object(env, object, "debit_account_id"),
197
187
  .credit_account_id = try translate.u128_from_object(env, object, "credit_account_id"),
198
188
  .user_data = try translate.u128_from_object(env, object, "user_data"),
199
- .reserved = try translate.bytes_from_object(env, object, 32, "reserved"),
189
+ .reserved = try translate.u128_from_object(env, object, "reserved"),
190
+ .pending_id = try translate.u128_from_object(env, object, "pending_id"),
200
191
  .timeout = try translate.u64_from_object(env, object, "timeout"),
201
- .code = try translate.u32_from_object(env, object, "code"),
202
- .flags = @bitCast(TransferFlags, try translate.u32_from_object(env, object, "flags")),
192
+ .ledger = try translate.u32_from_object(env, object, "ledger"),
193
+ .code = try translate.u16_from_object(env, object, "code"),
194
+ .flags = @bitCast(TransferFlags, try translate.u16_from_object(env, object, "flags")),
203
195
  .amount = try translate.u64_from_object(env, object, "amount"),
204
196
  .timestamp = try validate_timestamp(env, object),
205
197
  },
@@ -207,13 +199,13 @@ fn decode_from_object(comptime T: type, env: c.napi_env, object: c.napi_value) !
207
199
  .id = try translate.u128_from_object(env, object, "id"),
208
200
  .user_data = try translate.u128_from_object(env, object, "user_data"),
209
201
  .reserved = try translate.bytes_from_object(env, object, 48, "reserved"),
210
- .unit = try translate.u16_from_object(env, object, "unit"),
202
+ .ledger = try translate.u32_from_object(env, object, "ledger"),
211
203
  .code = try translate.u16_from_object(env, object, "code"),
212
- .flags = @bitCast(AccountFlags, try translate.u32_from_object(env, object, "flags")),
213
- .debits_reserved = try translate.u64_from_object(env, object, "debits_reserved"),
214
- .debits_accepted = try translate.u64_from_object(env, object, "debits_accepted"),
215
- .credits_reserved = try translate.u64_from_object(env, object, "credits_reserved"),
216
- .credits_accepted = try translate.u64_from_object(env, object, "credits_accepted"),
204
+ .flags = @bitCast(AccountFlags, try translate.u16_from_object(env, object, "flags")),
205
+ .debits_pending = try translate.u64_from_object(env, object, "debits_pending"),
206
+ .debits_posted = try translate.u64_from_object(env, object, "debits_posted"),
207
+ .credits_pending = try translate.u64_from_object(env, object, "credits_pending"),
208
+ .credits_posted = try translate.u64_from_object(env, object, "credits_posted"),
217
209
  .timestamp = try validate_timestamp(env, object),
218
210
  },
219
211
  u128 => try translate.u128_from_value(env, object, "lookup"),
@@ -230,7 +222,6 @@ pub fn decode_events(
230
222
  return switch (operation) {
231
223
  .create_accounts => try decode_events_from_array(env, array, Account, output),
232
224
  .create_transfers => try decode_events_from_array(env, array, Transfer, output),
233
- .commit_transfers => try decode_events_from_array(env, array, Commit, output),
234
225
  .lookup_accounts => try decode_events_from_array(env, array, u128, output),
235
226
  .lookup_transfers => try decode_events_from_array(env, array, u128, output),
236
227
  else => unreachable,
@@ -277,7 +268,7 @@ fn encode_napi_results_array(
277
268
  );
278
269
 
279
270
  switch (Result) {
280
- CreateAccountsResult, CreateTransfersResult, CommitTransfersResult => {
271
+ CreateAccountsResult, CreateTransfersResult => {
281
272
  var i: u32 = 0;
282
273
  while (i < results.len) : (i += 1) {
283
274
  const result = results[i];
@@ -347,57 +338,57 @@ fn encode_napi_results_array(
347
338
  try translate.u32_into_object(
348
339
  env,
349
340
  napi_object,
350
- "unit",
351
- @intCast(u32, result.unit),
352
- "Failed to set property \"unit\" of account lookup result.",
341
+ "ledger",
342
+ @intCast(u32, result.ledger),
343
+ "Failed to set property \"ledger\" of account lookup result.",
353
344
  );
354
345
 
355
- try translate.u32_into_object(
346
+ try translate.u16_into_object(
356
347
  env,
357
348
  napi_object,
358
349
  "code",
359
- @intCast(u32, result.code),
350
+ @intCast(u16, result.code),
360
351
  "Failed to set property \"code\" of account lookup result.",
361
352
  );
362
353
 
363
- try translate.u32_into_object(
354
+ try translate.u16_into_object(
364
355
  env,
365
356
  napi_object,
366
357
  "flags",
367
- @bitCast(u32, result.flags),
358
+ @bitCast(u16, result.flags),
368
359
  "Failed to set property \"flags\" of account lookup result.",
369
360
  );
370
361
 
371
362
  try translate.u64_into_object(
372
363
  env,
373
364
  napi_object,
374
- "debits_reserved",
375
- result.debits_reserved,
376
- "Failed to set property \"debits_reserved\" of account lookup result.",
365
+ "debits_pending",
366
+ result.debits_pending,
367
+ "Failed to set property \"debits_pending\" of account lookup result.",
377
368
  );
378
369
 
379
370
  try translate.u64_into_object(
380
371
  env,
381
372
  napi_object,
382
- "debits_accepted",
383
- result.debits_accepted,
384
- "Failed to set property \"debits_accepted\" of account lookup result.",
373
+ "debits_posted",
374
+ result.debits_posted,
375
+ "Failed to set property \"debits_posted\" of account lookup result.",
385
376
  );
386
377
 
387
378
  try translate.u64_into_object(
388
379
  env,
389
380
  napi_object,
390
- "credits_reserved",
391
- result.credits_reserved,
392
- "Failed to set property \"credits_reserved\" of account lookup result.",
381
+ "credits_pending",
382
+ result.credits_pending,
383
+ "Failed to set property \"credits_pending\" of account lookup result.",
393
384
  );
394
385
 
395
386
  try translate.u64_into_object(
396
387
  env,
397
388
  napi_object,
398
- "credits_accepted",
399
- result.credits_accepted,
400
- "Failed to set property \"credits_accepted\" of account lookup result.",
389
+ "credits_posted",
390
+ result.credits_posted,
391
+ "Failed to set property \"credits_posted\" of account lookup result.",
401
392
  );
402
393
 
403
394
  try translate.u64_into_object(
@@ -458,14 +449,22 @@ fn encode_napi_results_array(
458
449
  "Failed to set property \"user_data\" of transfer lookup result.",
459
450
  );
460
451
 
461
- try translate.byte_slice_into_object(
452
+ try translate.u128_into_object(
462
453
  env,
463
454
  napi_object,
464
455
  "reserved",
465
- &result.reserved,
456
+ result.reserved,
466
457
  "Failed to set property \"reserved\" of transfer lookup result.",
467
458
  );
468
459
 
460
+ try translate.u128_into_object(
461
+ env,
462
+ napi_object,
463
+ "pending_id",
464
+ result.pending_id,
465
+ "Failed to set property \"pending_id\" of transfer lookup result.",
466
+ );
467
+
469
468
  try translate.u64_into_object(
470
469
  env,
471
470
  napi_object,
@@ -475,18 +474,26 @@ fn encode_napi_results_array(
475
474
  );
476
475
 
477
476
  try translate.u32_into_object(
477
+ env,
478
+ napi_object,
479
+ "ledger",
480
+ @intCast(u32, result.ledger),
481
+ "Failed to set property \"ledger\" of transfer lookup result.",
482
+ );
483
+
484
+ try translate.u16_into_object(
478
485
  env,
479
486
  napi_object,
480
487
  "code",
481
- @intCast(u32, result.code),
488
+ @intCast(u16, result.code),
482
489
  "Failed to set property \"code\" of transfer lookup result.",
483
490
  );
484
491
 
485
- try translate.u32_into_object(
492
+ try translate.u16_into_object(
486
493
  env,
487
494
  napi_object,
488
495
  "flags",
489
- @bitCast(u32, result.flags),
496
+ @bitCast(u16, result.flags),
490
497
  "Failed to set property \"flags\" of transfer lookup result.",
491
498
  );
492
499
 
@@ -579,12 +586,7 @@ fn request(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_valu
579
586
  translate.throw(env, "Unknown operation.") catch return null;
580
587
  }
581
588
 
582
- const message = context.client.get_message() orelse {
583
- translate.throw(
584
- env,
585
- "Too many requests outstanding.",
586
- ) catch return null;
587
- };
589
+ const message = context.client.get_message();
588
590
  defer context.client.unref(message);
589
591
 
590
592
  const operation = @intToEnum(Operation, @intCast(u8, operation_int));
@@ -634,12 +636,7 @@ fn raw_request(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_
634
636
  }
635
637
  const operation = @intToEnum(Operation, @intCast(u8, operation_int));
636
638
 
637
- const message = context.client.get_message() orelse {
638
- translate.throw(
639
- env,
640
- "Too many requests outstanding.",
641
- ) catch return null;
642
- };
639
+ const message = context.client.get_message();
643
640
  defer context.client.unref(message);
644
641
 
645
642
  const body_length = translate.bytes_from_buffer(
@@ -707,11 +704,6 @@ fn on_result(user_data: u128, operation: Operation, results: Client.Error![]cons
707
704
  env,
708
705
  value,
709
706
  ) catch return,
710
- .commit_transfers => encode_napi_results_array(
711
- CommitTransfersResult,
712
- env,
713
- value,
714
- ) catch return,
715
707
  .lookup_accounts => encode_napi_results_array(Account, env, value) catch return,
716
708
  .lookup_transfers => encode_napi_results_array(Transfer, env, value) catch return,
717
709
  };