tigerbeetle-node 0.17.4 → 0.17.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.
package/dist/test.js CHANGED
@@ -5,9 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const assert_1 = __importDefault(require("assert"));
7
7
  const _1 = require(".");
8
+ async function sleep_ms(ms) {
9
+ await new Promise(resolve => setTimeout(resolve, ms));
10
+ }
11
+ function range(n) {
12
+ return Array.from({ length: n }, (_, i) => i);
13
+ }
14
+ function random_index(array) {
15
+ return Math.floor(Math.random() * array.length);
16
+ }
17
+ const REPLICA_ADDRESSES = [process.env.TB_ADDRESS || '3000'];
8
18
  const client = (0, _1.createClient)({
9
19
  cluster_id: 0n,
10
- replica_addresses: [process.env.TB_ADDRESS || '3000']
20
+ replica_addresses: REPLICA_ADDRESSES
11
21
  });
12
22
  const accountA = {
13
23
  id: 17n,
@@ -51,7 +61,7 @@ test('id() monotonically increasing', async () => {
51
61
  let idA = (0, _1.id)();
52
62
  for (let i = 0; i < 10000000; i++) {
53
63
  if (i % 10000 == 0) {
54
- await new Promise(resolve => setTimeout(resolve, 1));
64
+ await sleep_ms(1);
55
65
  }
56
66
  const idB = (0, _1.id)();
57
67
  assert_1.default.ok(idB > idA, 'id() returned an id that did not monotonically increase');
@@ -89,8 +99,8 @@ test('error if timestamp is not set to 0n on account', async () => {
89
99
  });
90
100
  test('batch max size', async () => {
91
101
  const BATCH_SIZE = 10000;
92
- var transfers = [];
93
- for (var i = 0; i < BATCH_SIZE; i++) {
102
+ const transfers = [];
103
+ for (let i = 0; i < BATCH_SIZE; i++) {
94
104
  transfers.push({
95
105
  id: 0n,
96
106
  debit_account_id: 0n,
@@ -113,6 +123,15 @@ test('batch max size', async () => {
113
123
  return true;
114
124
  });
115
125
  });
126
+ test('batch invalid size', async () => {
127
+ const transfers = [];
128
+ transfers.length = 0xffffffff;
129
+ assert_1.default.rejects(async () => await client.createTransfers(transfers), (err) => {
130
+ assert_1.default.ok(err instanceof _1.RequestError);
131
+ assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_TOO_MUCH_DATA);
132
+ return true;
133
+ });
134
+ });
116
135
  test('can lookup accounts', async () => {
117
136
  const accounts = await client.lookupAccounts([accountA.id, accountB.id]);
118
137
  assert_1.default.strictEqual(accounts.length, 2);
@@ -371,7 +390,7 @@ test('cannot void an expired transfer', async () => {
371
390
  assert_1.default.deepStrictEqual(transfers_results.length, 1);
372
391
  assert_1.default.ok(transfers_results[0].timestamp > 0);
373
392
  assert_1.default.deepStrictEqual(transfers_results[0].status, _1.CreateTransferStatus.created);
374
- var accounts = await client.lookupAccounts([accountA.id, accountB.id]);
393
+ let accounts = await client.lookupAccounts([accountA.id, accountB.id]);
375
394
  assert_1.default.strictEqual(accounts.length, 2);
376
395
  assert_1.default.strictEqual(accounts[0].credits_posted, 150n);
377
396
  assert_1.default.strictEqual(accounts[0].credits_pending, 50n);
@@ -382,7 +401,7 @@ test('cannot void an expired transfer', async () => {
382
401
  assert_1.default.strictEqual(accounts[1].debits_posted, 150n);
383
402
  assert_1.default.strictEqual(accounts[1].debits_pending, 50n);
384
403
  const extra_wait_time = 500;
385
- await new Promise(_ => setTimeout(_, (transfer.timeout * 1000) + extra_wait_time));
404
+ await sleep_ms((transfer.timeout * 1000) + extra_wait_time);
386
405
  accounts = await client.lookupAccounts([accountA.id, accountB.id]);
387
406
  assert_1.default.strictEqual(accounts.length, 2);
388
407
  assert_1.default.strictEqual(accounts[0].credits_posted, 150n);
@@ -485,8 +504,8 @@ test('can get account transfers', async () => {
485
504
  assert_1.default.deepStrictEqual(account_results.length, 1);
486
505
  assert_1.default.ok(account_results[0].timestamp > 0);
487
506
  assert_1.default.deepStrictEqual(account_results[0].status, _1.CreateAccountStatus.created);
488
- var transfers_created = [];
489
- for (var i = 0; i < 10; i++) {
507
+ const transfers_created = [];
508
+ for (let i = 0; i < 10; i++) {
490
509
  transfers_created.push({
491
510
  id: BigInt(i + 10000),
492
511
  debit_account_id: i % 2 == 0 ? accountC.id : accountA.id,
@@ -509,7 +528,7 @@ test('can get account transfers', async () => {
509
528
  assert_1.default.ok(result.timestamp > 0);
510
529
  assert_1.default.deepStrictEqual(result.status, _1.CreateTransferStatus.created);
511
530
  }
512
- var filter = {
531
+ let filter = {
513
532
  account_id: accountC.id,
514
533
  user_data_128: 0n,
515
534
  user_data_64: 0n,
@@ -520,13 +539,13 @@ test('can get account transfers', async () => {
520
539
  limit: BATCH_MAX,
521
540
  flags: _1.AccountFilterFlags.credits | _1.AccountFilterFlags.debits,
522
541
  };
523
- var transfers = await client.getAccountTransfers(filter);
524
- var account_balances = await client.getAccountBalances(filter);
542
+ let transfers = await client.getAccountTransfers(filter);
543
+ let account_balances = await client.getAccountBalances(filter);
525
544
  assert_1.default.strictEqual(transfers.length, transfers_created.length);
526
545
  assert_1.default.strictEqual(account_balances.length, transfers.length);
527
- var timestamp = 0n;
528
- var i = 0;
529
- for (var transfer of transfers) {
546
+ let timestamp = 0n;
547
+ let i = 0;
548
+ for (const transfer of transfers) {
530
549
  assert_1.default.ok(timestamp < transfer.timestamp);
531
550
  timestamp = transfer.timestamp;
532
551
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -549,7 +568,7 @@ test('can get account transfers', async () => {
549
568
  assert_1.default.strictEqual(account_balances.length, transfers.length);
550
569
  timestamp = 1n << 64n;
551
570
  i = 0;
552
- for (var transfer of transfers) {
571
+ for (const transfer of transfers) {
553
572
  assert_1.default.ok(transfer.timestamp < timestamp);
554
573
  timestamp = transfer.timestamp;
555
574
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -572,7 +591,7 @@ test('can get account transfers', async () => {
572
591
  assert_1.default.strictEqual(account_balances.length, transfers.length);
573
592
  timestamp = 1n << 64n;
574
593
  i = 0;
575
- for (var transfer of transfers) {
594
+ for (const transfer of transfers) {
576
595
  assert_1.default.ok(transfer.timestamp < timestamp);
577
596
  timestamp = transfer.timestamp;
578
597
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -595,7 +614,7 @@ test('can get account transfers', async () => {
595
614
  assert_1.default.strictEqual(account_balances.length, transfers.length);
596
615
  timestamp = 0n;
597
616
  i = 0;
598
- for (var transfer of transfers) {
617
+ for (const transfer of transfers) {
599
618
  assert_1.default.ok(timestamp < transfer.timestamp);
600
619
  timestamp = transfer.timestamp;
601
620
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -617,7 +636,7 @@ test('can get account transfers', async () => {
617
636
  assert_1.default.strictEqual(transfers.length, transfers_created.length / 2);
618
637
  assert_1.default.strictEqual(account_balances.length, transfers.length);
619
638
  i = 0;
620
- for (var transfer of transfers) {
639
+ for (const transfer of transfers) {
621
640
  assert_1.default.ok(timestamp < transfer.timestamp);
622
641
  timestamp = transfer.timestamp;
623
642
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -655,7 +674,7 @@ test('can get account transfers', async () => {
655
674
  assert_1.default.strictEqual(account_balances.length, transfers.length);
656
675
  timestamp = 1n << 64n;
657
676
  i = 0;
658
- for (var transfer of transfers) {
677
+ for (const transfer of transfers) {
659
678
  assert_1.default.ok(timestamp > transfer.timestamp);
660
679
  timestamp = transfer.timestamp;
661
680
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -677,7 +696,7 @@ test('can get account transfers', async () => {
677
696
  assert_1.default.strictEqual(transfers.length, transfers_created.length / 2);
678
697
  assert_1.default.strictEqual(account_balances.length, transfers.length);
679
698
  i = 0;
680
- for (var transfer of transfers) {
699
+ for (const transfer of transfers) {
681
700
  assert_1.default.ok(timestamp > transfer.timestamp);
682
701
  timestamp = transfer.timestamp;
683
702
  assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
@@ -813,8 +832,8 @@ test('can get account transfers', async () => {
813
832
  });
814
833
  test('can query accounts', async () => {
815
834
  {
816
- var accounts = [];
817
- for (var i = 0; i < 10; i++) {
835
+ const accounts = [];
836
+ for (let i = 0; i < 10; i++) {
818
837
  accounts.push({
819
838
  id: (0, _1.id)(),
820
839
  debits_pending: 0n,
@@ -839,7 +858,7 @@ test('can query accounts', async () => {
839
858
  }
840
859
  }
841
860
  {
842
- var filter = {
861
+ const filter = {
843
862
  user_data_128: 1000n,
844
863
  user_data_64: 100n,
845
864
  user_data_32: 10,
@@ -850,10 +869,10 @@ test('can query accounts', async () => {
850
869
  limit: BATCH_MAX,
851
870
  flags: _1.QueryFilterFlags.none,
852
871
  };
853
- var query = await client.queryAccounts(filter);
872
+ const query = await client.queryAccounts(filter);
854
873
  assert_1.default.strictEqual(query.length, 5);
855
- var timestamp = 0n;
856
- for (var account of query) {
874
+ let timestamp = 0n;
875
+ for (const account of query) {
857
876
  assert_1.default.ok(timestamp < account.timestamp);
858
877
  timestamp = account.timestamp;
859
878
  assert_1.default.strictEqual(account.user_data_128, filter.user_data_128);
@@ -864,7 +883,7 @@ test('can query accounts', async () => {
864
883
  }
865
884
  }
866
885
  {
867
- var filter = {
886
+ const filter = {
868
887
  user_data_128: 2000n,
869
888
  user_data_64: 200n,
870
889
  user_data_32: 20,
@@ -875,10 +894,10 @@ test('can query accounts', async () => {
875
894
  limit: BATCH_MAX,
876
895
  flags: _1.QueryFilterFlags.reversed,
877
896
  };
878
- var query = await client.queryAccounts(filter);
897
+ const query = await client.queryAccounts(filter);
879
898
  assert_1.default.strictEqual(query.length, 5);
880
- var timestamp = 1n << 64n;
881
- for (var account of query) {
899
+ let timestamp = 1n << 64n;
900
+ for (const account of query) {
882
901
  assert_1.default.ok(timestamp > account.timestamp);
883
902
  timestamp = account.timestamp;
884
903
  assert_1.default.strictEqual(account.user_data_128, filter.user_data_128);
@@ -889,7 +908,7 @@ test('can query accounts', async () => {
889
908
  }
890
909
  }
891
910
  {
892
- var filter = {
911
+ const filter = {
893
912
  user_data_128: 0n,
894
913
  user_data_64: 0n,
895
914
  user_data_32: 0,
@@ -900,17 +919,17 @@ test('can query accounts', async () => {
900
919
  limit: BATCH_MAX,
901
920
  flags: _1.QueryFilterFlags.none,
902
921
  };
903
- var query = await client.queryAccounts(filter);
922
+ const query = await client.queryAccounts(filter);
904
923
  assert_1.default.strictEqual(query.length, 10);
905
- var timestamp = 0n;
906
- for (var account of query) {
924
+ let timestamp = 0n;
925
+ for (const account of query) {
907
926
  assert_1.default.ok(timestamp < account.timestamp);
908
927
  timestamp = account.timestamp;
909
928
  assert_1.default.strictEqual(account.code, filter.code);
910
929
  }
911
930
  }
912
931
  {
913
- var filter = {
932
+ const filter = {
914
933
  user_data_128: 0n,
915
934
  user_data_64: 0n,
916
935
  user_data_32: 0,
@@ -921,10 +940,10 @@ test('can query accounts', async () => {
921
940
  limit: 5,
922
941
  flags: _1.QueryFilterFlags.reversed,
923
942
  };
924
- var query = await client.queryAccounts(filter);
943
+ let query = await client.queryAccounts(filter);
925
944
  assert_1.default.strictEqual(query.length, 5);
926
- var timestamp = 1n << 64n;
927
- for (var account of query) {
945
+ let timestamp = 1n << 64n;
946
+ for (const account of query) {
928
947
  assert_1.default.ok(timestamp > account.timestamp);
929
948
  timestamp = account.timestamp;
930
949
  assert_1.default.strictEqual(account.code, filter.code);
@@ -932,7 +951,7 @@ test('can query accounts', async () => {
932
951
  filter.timestamp_max = timestamp - 1n;
933
952
  query = await client.queryAccounts(filter);
934
953
  assert_1.default.strictEqual(query.length, 5);
935
- for (var account of query) {
954
+ for (const account of query) {
936
955
  assert_1.default.ok(timestamp > account.timestamp);
937
956
  timestamp = account.timestamp;
938
957
  assert_1.default.strictEqual(account.code, filter.code);
@@ -942,7 +961,7 @@ test('can query accounts', async () => {
942
961
  assert_1.default.strictEqual(query.length, 0);
943
962
  }
944
963
  {
945
- var filter = {
964
+ const filter = {
946
965
  user_data_128: 0n,
947
966
  user_data_64: 200n,
948
967
  user_data_32: 10,
@@ -953,7 +972,7 @@ test('can query accounts', async () => {
953
972
  limit: BATCH_MAX,
954
973
  flags: _1.QueryFilterFlags.none,
955
974
  };
956
- var query = await client.queryAccounts(filter);
975
+ const query = await client.queryAccounts(filter);
957
976
  assert_1.default.strictEqual(query.length, 0);
958
977
  }
959
978
  });
@@ -978,8 +997,8 @@ test('can query transfers', async () => {
978
997
  assert_1.default.deepStrictEqual(account_results.length, 1);
979
998
  assert_1.default.ok(account_results[0].timestamp > 0);
980
999
  assert_1.default.deepStrictEqual(account_results[0].status, _1.CreateAccountStatus.created);
981
- var transfers_created = [];
982
- for (var i = 0; i < 10; i++) {
1000
+ const transfers_created = [];
1001
+ for (let i = 0; i < 10; i++) {
983
1002
  transfers_created.push({
984
1003
  id: (0, _1.id)(),
985
1004
  debit_account_id: i % 2 == 0 ? account.id : accountA.id,
@@ -1004,7 +1023,7 @@ test('can query transfers', async () => {
1004
1023
  }
1005
1024
  }
1006
1025
  {
1007
- var filter = {
1026
+ const filter = {
1008
1027
  user_data_128: 1000n,
1009
1028
  user_data_64: 100n,
1010
1029
  user_data_32: 10,
@@ -1015,10 +1034,10 @@ test('can query transfers', async () => {
1015
1034
  limit: BATCH_MAX,
1016
1035
  flags: _1.QueryFilterFlags.none,
1017
1036
  };
1018
- var query = await client.queryTransfers(filter);
1037
+ const query = await client.queryTransfers(filter);
1019
1038
  assert_1.default.strictEqual(query.length, 5);
1020
- var timestamp = 0n;
1021
- for (var transfer of query) {
1039
+ let timestamp = 0n;
1040
+ for (const transfer of query) {
1022
1041
  assert_1.default.ok(timestamp < transfer.timestamp);
1023
1042
  timestamp = transfer.timestamp;
1024
1043
  assert_1.default.strictEqual(transfer.user_data_128, filter.user_data_128);
@@ -1029,7 +1048,7 @@ test('can query transfers', async () => {
1029
1048
  }
1030
1049
  }
1031
1050
  {
1032
- var filter = {
1051
+ const filter = {
1033
1052
  user_data_128: 2000n,
1034
1053
  user_data_64: 200n,
1035
1054
  user_data_32: 20,
@@ -1040,10 +1059,10 @@ test('can query transfers', async () => {
1040
1059
  limit: BATCH_MAX,
1041
1060
  flags: _1.QueryFilterFlags.reversed,
1042
1061
  };
1043
- var query = await client.queryTransfers(filter);
1062
+ const query = await client.queryTransfers(filter);
1044
1063
  assert_1.default.strictEqual(query.length, 5);
1045
- var timestamp = 1n << 64n;
1046
- for (var transfer of query) {
1064
+ let timestamp = 1n << 64n;
1065
+ for (const transfer of query) {
1047
1066
  assert_1.default.ok(timestamp > transfer.timestamp);
1048
1067
  timestamp = transfer.timestamp;
1049
1068
  assert_1.default.strictEqual(transfer.user_data_128, filter.user_data_128);
@@ -1054,7 +1073,7 @@ test('can query transfers', async () => {
1054
1073
  }
1055
1074
  }
1056
1075
  {
1057
- var filter = {
1076
+ const filter = {
1058
1077
  user_data_128: 0n,
1059
1078
  user_data_64: 0n,
1060
1079
  user_data_32: 0,
@@ -1065,17 +1084,17 @@ test('can query transfers', async () => {
1065
1084
  limit: BATCH_MAX,
1066
1085
  flags: _1.QueryFilterFlags.none,
1067
1086
  };
1068
- var query = await client.queryTransfers(filter);
1087
+ const query = await client.queryTransfers(filter);
1069
1088
  assert_1.default.strictEqual(query.length, 10);
1070
- var timestamp = 0n;
1071
- for (var transfer of query) {
1089
+ let timestamp = 0n;
1090
+ for (const transfer of query) {
1072
1091
  assert_1.default.ok(timestamp < transfer.timestamp);
1073
1092
  timestamp = transfer.timestamp;
1074
1093
  assert_1.default.strictEqual(transfer.code, filter.code);
1075
1094
  }
1076
1095
  }
1077
1096
  {
1078
- var filter = {
1097
+ const filter = {
1079
1098
  user_data_128: 0n,
1080
1099
  user_data_64: 0n,
1081
1100
  user_data_32: 0,
@@ -1086,10 +1105,10 @@ test('can query transfers', async () => {
1086
1105
  limit: 5,
1087
1106
  flags: _1.QueryFilterFlags.reversed,
1088
1107
  };
1089
- var query = await client.queryTransfers(filter);
1108
+ let query = await client.queryTransfers(filter);
1090
1109
  assert_1.default.strictEqual(query.length, 5);
1091
- var timestamp = 1n << 64n;
1092
- for (var transfer of query) {
1110
+ let timestamp = 1n << 64n;
1111
+ for (const transfer of query) {
1093
1112
  assert_1.default.ok(timestamp > transfer.timestamp);
1094
1113
  timestamp = transfer.timestamp;
1095
1114
  assert_1.default.strictEqual(transfer.code, filter.code);
@@ -1097,7 +1116,7 @@ test('can query transfers', async () => {
1097
1116
  filter.timestamp_max = timestamp - 1n;
1098
1117
  query = await client.queryTransfers(filter);
1099
1118
  assert_1.default.strictEqual(query.length, 5);
1100
- for (var transfer of query) {
1119
+ for (const transfer of query) {
1101
1120
  assert_1.default.ok(timestamp > transfer.timestamp);
1102
1121
  timestamp = transfer.timestamp;
1103
1122
  assert_1.default.strictEqual(transfer.code, filter.code);
@@ -1107,7 +1126,7 @@ test('can query transfers', async () => {
1107
1126
  assert_1.default.strictEqual(query.length, 0);
1108
1127
  }
1109
1128
  {
1110
- var filter = {
1129
+ const filter = {
1111
1130
  user_data_128: 0n,
1112
1131
  user_data_64: 200n,
1113
1132
  user_data_32: 10,
@@ -1118,7 +1137,7 @@ test('can query transfers', async () => {
1118
1137
  limit: BATCH_MAX,
1119
1138
  flags: _1.QueryFilterFlags.none,
1120
1139
  };
1121
- var query = await client.queryTransfers(filter);
1140
+ const query = await client.queryTransfers(filter);
1122
1141
  assert_1.default.strictEqual(query.length, 0);
1123
1142
  }
1124
1143
  });
@@ -1233,7 +1252,7 @@ test('can import accounts and transfers', async () => {
1233
1252
  let accountLookup = await client.lookupAccounts([accountTmp.id]);
1234
1253
  assert_1.default.strictEqual(accountLookup.length, 1);
1235
1254
  const timestampMax = accountLookup[0].timestamp;
1236
- await new Promise(_ => setTimeout(_, 10));
1255
+ await sleep_ms(10);
1237
1256
  const accountA = {
1238
1257
  id: (0, _1.id)(),
1239
1258
  debits_pending: 0n,
@@ -1314,13 +1333,46 @@ test('accept zero-length lookup_transfers', async () => {
1314
1333
  assert_1.default.deepStrictEqual(transfers, []);
1315
1334
  });
1316
1335
  test("destroy client in-flight", async () => {
1317
- const client = (0, _1.createClient)({ cluster_id: 92n, replica_addresses: ["99"] });
1318
- setTimeout(() => client.destroy(), 30);
1319
- assert_1.default.rejects(async () => await client.lookupAccounts([0n]), (err) => {
1320
- assert_1.default.ok(err instanceof _1.RequestError);
1321
- assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_CLIENT_CLOSED);
1322
- return true;
1336
+ const client_count = 5;
1337
+ const action_count = 50;
1338
+ const clients = range(client_count).map(() => (0, _1.createClient)({
1339
+ cluster_id: 0n,
1340
+ replica_addresses: REPLICA_ADDRESSES,
1341
+ }));
1342
+ const ids = [];
1343
+ const actions = range(action_count).map(() => async () => {
1344
+ await sleep_ms(Math.random() < 0.2 ? 0 : Math.random());
1345
+ const client = clients[random_index(clients)];
1346
+ if (Math.random() < 0.1) {
1347
+ client.destroy();
1348
+ return;
1349
+ }
1350
+ if (Math.random() < 0.7) {
1351
+ const id_new = (0, _1.id)();
1352
+ ids.push(id_new);
1353
+ try {
1354
+ await client.createAccounts([{ ...accountA, id: id_new }]);
1355
+ }
1356
+ catch (err) {
1357
+ assert_1.default.ok(err instanceof _1.RequestError);
1358
+ assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_CLIENT_CLOSED);
1359
+ }
1360
+ return;
1361
+ }
1362
+ try {
1363
+ const id_lookup = (Math.random() < 0.2 || ids.length == 0)
1364
+ ? BigInt(Math.floor(Math.random() * 10000))
1365
+ : ids[random_index(ids)];
1366
+ await client.lookupAccounts([id_lookup]);
1367
+ }
1368
+ catch (err) {
1369
+ assert_1.default.ok(err instanceof _1.RequestError);
1370
+ assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_CLIENT_CLOSED);
1371
+ }
1323
1372
  });
1373
+ await Promise.all(actions.map((f) => f()));
1374
+ for (const client of clients)
1375
+ client.destroy();
1324
1376
  });
1325
1377
  async function main() {
1326
1378
  const start = new Date().getTime();