tigerbeetle-node 0.17.4 → 0.17.6
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/README.md +1 -0
- package/dist/bin/aarch64-linux-gnu/client.node +0 -0
- package/dist/bin/aarch64-linux-musl/client.node +0 -0
- package/dist/bin/aarch64-macos/client.node +0 -0
- package/dist/bin/x86_64-linux-gnu/client.node +0 -0
- package/dist/bin/x86_64-linux-musl/client.node +0 -0
- package/dist/bin/x86_64-macos/client.node +0 -0
- package/dist/bin/x86_64-windows/client.node +0 -0
- package/dist/bindings.js.map +1 -1
- package/dist/test.js +165 -69
- package/dist/test.js.map +1 -1
- package/package.json +1 -1
- package/src/bindings.ts +348 -348
- package/src/test.ts +178 -72
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:
|
|
20
|
+
replica_addresses: REPLICA_ADDRESSES
|
|
11
21
|
});
|
|
12
22
|
const accountA = {
|
|
13
23
|
id: 17n,
|
|
@@ -47,11 +57,55 @@ function test(name, fn) {
|
|
|
47
57
|
test.skip = (name, fn) => {
|
|
48
58
|
console.log(name + ': SKIPPED');
|
|
49
59
|
};
|
|
60
|
+
test('Serialization: BigInt exceeds U128', async () => {
|
|
61
|
+
const transfer = {
|
|
62
|
+
id: 9999999999999999999999999999999999999999n,
|
|
63
|
+
debit_account_id: 0n,
|
|
64
|
+
credit_account_id: 0n,
|
|
65
|
+
amount: 0n,
|
|
66
|
+
user_data_128: 0n,
|
|
67
|
+
user_data_64: 0n,
|
|
68
|
+
user_data_32: 0,
|
|
69
|
+
pending_id: 0n,
|
|
70
|
+
timeout: 0,
|
|
71
|
+
ledger: 0,
|
|
72
|
+
code: 0,
|
|
73
|
+
flags: 0,
|
|
74
|
+
timestamp: 0n,
|
|
75
|
+
};
|
|
76
|
+
assert_1.default.rejects(async () => await client.createTransfers([transfer]), (err) => {
|
|
77
|
+
assert_1.default.ok(err instanceof Error);
|
|
78
|
+
assert_1.default.strictEqual(err.message, "id must fit in 128 bits");
|
|
79
|
+
return true;
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
test('Serialization: BigInt negative', async () => {
|
|
83
|
+
const transfer = {
|
|
84
|
+
id: -1n,
|
|
85
|
+
debit_account_id: 0n,
|
|
86
|
+
credit_account_id: 0n,
|
|
87
|
+
amount: 0n,
|
|
88
|
+
user_data_128: 0n,
|
|
89
|
+
user_data_64: 0n,
|
|
90
|
+
user_data_32: 0,
|
|
91
|
+
pending_id: 0n,
|
|
92
|
+
timeout: 0,
|
|
93
|
+
ledger: 0,
|
|
94
|
+
code: 0,
|
|
95
|
+
flags: 0,
|
|
96
|
+
timestamp: 0n,
|
|
97
|
+
};
|
|
98
|
+
assert_1.default.rejects(async () => await client.createTransfers([transfer]), (err) => {
|
|
99
|
+
assert_1.default.ok(err instanceof Error);
|
|
100
|
+
assert_1.default.strictEqual(err.message, "id must be positive");
|
|
101
|
+
return true;
|
|
102
|
+
});
|
|
103
|
+
});
|
|
50
104
|
test('id() monotonically increasing', async () => {
|
|
51
105
|
let idA = (0, _1.id)();
|
|
52
106
|
for (let i = 0; i < 10000000; i++) {
|
|
53
107
|
if (i % 10000 == 0) {
|
|
54
|
-
await
|
|
108
|
+
await sleep_ms(1);
|
|
55
109
|
}
|
|
56
110
|
const idB = (0, _1.id)();
|
|
57
111
|
assert_1.default.ok(idB > idA, 'id() returned an id that did not monotonically increase');
|
|
@@ -89,8 +143,8 @@ test('error if timestamp is not set to 0n on account', async () => {
|
|
|
89
143
|
});
|
|
90
144
|
test('batch max size', async () => {
|
|
91
145
|
const BATCH_SIZE = 10000;
|
|
92
|
-
|
|
93
|
-
for (
|
|
146
|
+
const transfers = [];
|
|
147
|
+
for (let i = 0; i < BATCH_SIZE; i++) {
|
|
94
148
|
transfers.push({
|
|
95
149
|
id: 0n,
|
|
96
150
|
debit_account_id: 0n,
|
|
@@ -113,6 +167,15 @@ test('batch max size', async () => {
|
|
|
113
167
|
return true;
|
|
114
168
|
});
|
|
115
169
|
});
|
|
170
|
+
test('batch invalid size', async () => {
|
|
171
|
+
const transfers = [];
|
|
172
|
+
transfers.length = 0xffffffff;
|
|
173
|
+
assert_1.default.rejects(async () => await client.createTransfers(transfers), (err) => {
|
|
174
|
+
assert_1.default.ok(err instanceof _1.RequestError);
|
|
175
|
+
assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_TOO_MUCH_DATA);
|
|
176
|
+
return true;
|
|
177
|
+
});
|
|
178
|
+
});
|
|
116
179
|
test('can lookup accounts', async () => {
|
|
117
180
|
const accounts = await client.lookupAccounts([accountA.id, accountB.id]);
|
|
118
181
|
assert_1.default.strictEqual(accounts.length, 2);
|
|
@@ -371,7 +434,7 @@ test('cannot void an expired transfer', async () => {
|
|
|
371
434
|
assert_1.default.deepStrictEqual(transfers_results.length, 1);
|
|
372
435
|
assert_1.default.ok(transfers_results[0].timestamp > 0);
|
|
373
436
|
assert_1.default.deepStrictEqual(transfers_results[0].status, _1.CreateTransferStatus.created);
|
|
374
|
-
|
|
437
|
+
let accounts = await client.lookupAccounts([accountA.id, accountB.id]);
|
|
375
438
|
assert_1.default.strictEqual(accounts.length, 2);
|
|
376
439
|
assert_1.default.strictEqual(accounts[0].credits_posted, 150n);
|
|
377
440
|
assert_1.default.strictEqual(accounts[0].credits_pending, 50n);
|
|
@@ -382,7 +445,7 @@ test('cannot void an expired transfer', async () => {
|
|
|
382
445
|
assert_1.default.strictEqual(accounts[1].debits_posted, 150n);
|
|
383
446
|
assert_1.default.strictEqual(accounts[1].debits_pending, 50n);
|
|
384
447
|
const extra_wait_time = 500;
|
|
385
|
-
await
|
|
448
|
+
await sleep_ms((transfer.timeout * 1000) + extra_wait_time);
|
|
386
449
|
accounts = await client.lookupAccounts([accountA.id, accountB.id]);
|
|
387
450
|
assert_1.default.strictEqual(accounts.length, 2);
|
|
388
451
|
assert_1.default.strictEqual(accounts[0].credits_posted, 150n);
|
|
@@ -485,8 +548,8 @@ test('can get account transfers', async () => {
|
|
|
485
548
|
assert_1.default.deepStrictEqual(account_results.length, 1);
|
|
486
549
|
assert_1.default.ok(account_results[0].timestamp > 0);
|
|
487
550
|
assert_1.default.deepStrictEqual(account_results[0].status, _1.CreateAccountStatus.created);
|
|
488
|
-
|
|
489
|
-
for (
|
|
551
|
+
const transfers_created = [];
|
|
552
|
+
for (let i = 0; i < 10; i++) {
|
|
490
553
|
transfers_created.push({
|
|
491
554
|
id: BigInt(i + 10000),
|
|
492
555
|
debit_account_id: i % 2 == 0 ? accountC.id : accountA.id,
|
|
@@ -509,7 +572,7 @@ test('can get account transfers', async () => {
|
|
|
509
572
|
assert_1.default.ok(result.timestamp > 0);
|
|
510
573
|
assert_1.default.deepStrictEqual(result.status, _1.CreateTransferStatus.created);
|
|
511
574
|
}
|
|
512
|
-
|
|
575
|
+
let filter = {
|
|
513
576
|
account_id: accountC.id,
|
|
514
577
|
user_data_128: 0n,
|
|
515
578
|
user_data_64: 0n,
|
|
@@ -520,13 +583,13 @@ test('can get account transfers', async () => {
|
|
|
520
583
|
limit: BATCH_MAX,
|
|
521
584
|
flags: _1.AccountFilterFlags.credits | _1.AccountFilterFlags.debits,
|
|
522
585
|
};
|
|
523
|
-
|
|
524
|
-
|
|
586
|
+
let transfers = await client.getAccountTransfers(filter);
|
|
587
|
+
let account_balances = await client.getAccountBalances(filter);
|
|
525
588
|
assert_1.default.strictEqual(transfers.length, transfers_created.length);
|
|
526
589
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
for (
|
|
590
|
+
let timestamp = 0n;
|
|
591
|
+
let i = 0;
|
|
592
|
+
for (const transfer of transfers) {
|
|
530
593
|
assert_1.default.ok(timestamp < transfer.timestamp);
|
|
531
594
|
timestamp = transfer.timestamp;
|
|
532
595
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -549,7 +612,7 @@ test('can get account transfers', async () => {
|
|
|
549
612
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
550
613
|
timestamp = 1n << 64n;
|
|
551
614
|
i = 0;
|
|
552
|
-
for (
|
|
615
|
+
for (const transfer of transfers) {
|
|
553
616
|
assert_1.default.ok(transfer.timestamp < timestamp);
|
|
554
617
|
timestamp = transfer.timestamp;
|
|
555
618
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -572,7 +635,7 @@ test('can get account transfers', async () => {
|
|
|
572
635
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
573
636
|
timestamp = 1n << 64n;
|
|
574
637
|
i = 0;
|
|
575
|
-
for (
|
|
638
|
+
for (const transfer of transfers) {
|
|
576
639
|
assert_1.default.ok(transfer.timestamp < timestamp);
|
|
577
640
|
timestamp = transfer.timestamp;
|
|
578
641
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -595,7 +658,7 @@ test('can get account transfers', async () => {
|
|
|
595
658
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
596
659
|
timestamp = 0n;
|
|
597
660
|
i = 0;
|
|
598
|
-
for (
|
|
661
|
+
for (const transfer of transfers) {
|
|
599
662
|
assert_1.default.ok(timestamp < transfer.timestamp);
|
|
600
663
|
timestamp = transfer.timestamp;
|
|
601
664
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -617,7 +680,7 @@ test('can get account transfers', async () => {
|
|
|
617
680
|
assert_1.default.strictEqual(transfers.length, transfers_created.length / 2);
|
|
618
681
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
619
682
|
i = 0;
|
|
620
|
-
for (
|
|
683
|
+
for (const transfer of transfers) {
|
|
621
684
|
assert_1.default.ok(timestamp < transfer.timestamp);
|
|
622
685
|
timestamp = transfer.timestamp;
|
|
623
686
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -655,7 +718,7 @@ test('can get account transfers', async () => {
|
|
|
655
718
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
656
719
|
timestamp = 1n << 64n;
|
|
657
720
|
i = 0;
|
|
658
|
-
for (
|
|
721
|
+
for (const transfer of transfers) {
|
|
659
722
|
assert_1.default.ok(timestamp > transfer.timestamp);
|
|
660
723
|
timestamp = transfer.timestamp;
|
|
661
724
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -677,7 +740,7 @@ test('can get account transfers', async () => {
|
|
|
677
740
|
assert_1.default.strictEqual(transfers.length, transfers_created.length / 2);
|
|
678
741
|
assert_1.default.strictEqual(account_balances.length, transfers.length);
|
|
679
742
|
i = 0;
|
|
680
|
-
for (
|
|
743
|
+
for (const transfer of transfers) {
|
|
681
744
|
assert_1.default.ok(timestamp > transfer.timestamp);
|
|
682
745
|
timestamp = transfer.timestamp;
|
|
683
746
|
assert_1.default.ok(account_balances[i].timestamp == transfer.timestamp);
|
|
@@ -813,8 +876,8 @@ test('can get account transfers', async () => {
|
|
|
813
876
|
});
|
|
814
877
|
test('can query accounts', async () => {
|
|
815
878
|
{
|
|
816
|
-
|
|
817
|
-
for (
|
|
879
|
+
const accounts = [];
|
|
880
|
+
for (let i = 0; i < 10; i++) {
|
|
818
881
|
accounts.push({
|
|
819
882
|
id: (0, _1.id)(),
|
|
820
883
|
debits_pending: 0n,
|
|
@@ -839,7 +902,7 @@ test('can query accounts', async () => {
|
|
|
839
902
|
}
|
|
840
903
|
}
|
|
841
904
|
{
|
|
842
|
-
|
|
905
|
+
const filter = {
|
|
843
906
|
user_data_128: 1000n,
|
|
844
907
|
user_data_64: 100n,
|
|
845
908
|
user_data_32: 10,
|
|
@@ -850,10 +913,10 @@ test('can query accounts', async () => {
|
|
|
850
913
|
limit: BATCH_MAX,
|
|
851
914
|
flags: _1.QueryFilterFlags.none,
|
|
852
915
|
};
|
|
853
|
-
|
|
916
|
+
const query = await client.queryAccounts(filter);
|
|
854
917
|
assert_1.default.strictEqual(query.length, 5);
|
|
855
|
-
|
|
856
|
-
for (
|
|
918
|
+
let timestamp = 0n;
|
|
919
|
+
for (const account of query) {
|
|
857
920
|
assert_1.default.ok(timestamp < account.timestamp);
|
|
858
921
|
timestamp = account.timestamp;
|
|
859
922
|
assert_1.default.strictEqual(account.user_data_128, filter.user_data_128);
|
|
@@ -864,7 +927,7 @@ test('can query accounts', async () => {
|
|
|
864
927
|
}
|
|
865
928
|
}
|
|
866
929
|
{
|
|
867
|
-
|
|
930
|
+
const filter = {
|
|
868
931
|
user_data_128: 2000n,
|
|
869
932
|
user_data_64: 200n,
|
|
870
933
|
user_data_32: 20,
|
|
@@ -875,10 +938,10 @@ test('can query accounts', async () => {
|
|
|
875
938
|
limit: BATCH_MAX,
|
|
876
939
|
flags: _1.QueryFilterFlags.reversed,
|
|
877
940
|
};
|
|
878
|
-
|
|
941
|
+
const query = await client.queryAccounts(filter);
|
|
879
942
|
assert_1.default.strictEqual(query.length, 5);
|
|
880
|
-
|
|
881
|
-
for (
|
|
943
|
+
let timestamp = 1n << 64n;
|
|
944
|
+
for (const account of query) {
|
|
882
945
|
assert_1.default.ok(timestamp > account.timestamp);
|
|
883
946
|
timestamp = account.timestamp;
|
|
884
947
|
assert_1.default.strictEqual(account.user_data_128, filter.user_data_128);
|
|
@@ -889,7 +952,7 @@ test('can query accounts', async () => {
|
|
|
889
952
|
}
|
|
890
953
|
}
|
|
891
954
|
{
|
|
892
|
-
|
|
955
|
+
const filter = {
|
|
893
956
|
user_data_128: 0n,
|
|
894
957
|
user_data_64: 0n,
|
|
895
958
|
user_data_32: 0,
|
|
@@ -900,17 +963,17 @@ test('can query accounts', async () => {
|
|
|
900
963
|
limit: BATCH_MAX,
|
|
901
964
|
flags: _1.QueryFilterFlags.none,
|
|
902
965
|
};
|
|
903
|
-
|
|
966
|
+
const query = await client.queryAccounts(filter);
|
|
904
967
|
assert_1.default.strictEqual(query.length, 10);
|
|
905
|
-
|
|
906
|
-
for (
|
|
968
|
+
let timestamp = 0n;
|
|
969
|
+
for (const account of query) {
|
|
907
970
|
assert_1.default.ok(timestamp < account.timestamp);
|
|
908
971
|
timestamp = account.timestamp;
|
|
909
972
|
assert_1.default.strictEqual(account.code, filter.code);
|
|
910
973
|
}
|
|
911
974
|
}
|
|
912
975
|
{
|
|
913
|
-
|
|
976
|
+
const filter = {
|
|
914
977
|
user_data_128: 0n,
|
|
915
978
|
user_data_64: 0n,
|
|
916
979
|
user_data_32: 0,
|
|
@@ -921,10 +984,10 @@ test('can query accounts', async () => {
|
|
|
921
984
|
limit: 5,
|
|
922
985
|
flags: _1.QueryFilterFlags.reversed,
|
|
923
986
|
};
|
|
924
|
-
|
|
987
|
+
let query = await client.queryAccounts(filter);
|
|
925
988
|
assert_1.default.strictEqual(query.length, 5);
|
|
926
|
-
|
|
927
|
-
for (
|
|
989
|
+
let timestamp = 1n << 64n;
|
|
990
|
+
for (const account of query) {
|
|
928
991
|
assert_1.default.ok(timestamp > account.timestamp);
|
|
929
992
|
timestamp = account.timestamp;
|
|
930
993
|
assert_1.default.strictEqual(account.code, filter.code);
|
|
@@ -932,7 +995,7 @@ test('can query accounts', async () => {
|
|
|
932
995
|
filter.timestamp_max = timestamp - 1n;
|
|
933
996
|
query = await client.queryAccounts(filter);
|
|
934
997
|
assert_1.default.strictEqual(query.length, 5);
|
|
935
|
-
for (
|
|
998
|
+
for (const account of query) {
|
|
936
999
|
assert_1.default.ok(timestamp > account.timestamp);
|
|
937
1000
|
timestamp = account.timestamp;
|
|
938
1001
|
assert_1.default.strictEqual(account.code, filter.code);
|
|
@@ -942,7 +1005,7 @@ test('can query accounts', async () => {
|
|
|
942
1005
|
assert_1.default.strictEqual(query.length, 0);
|
|
943
1006
|
}
|
|
944
1007
|
{
|
|
945
|
-
|
|
1008
|
+
const filter = {
|
|
946
1009
|
user_data_128: 0n,
|
|
947
1010
|
user_data_64: 200n,
|
|
948
1011
|
user_data_32: 10,
|
|
@@ -953,7 +1016,7 @@ test('can query accounts', async () => {
|
|
|
953
1016
|
limit: BATCH_MAX,
|
|
954
1017
|
flags: _1.QueryFilterFlags.none,
|
|
955
1018
|
};
|
|
956
|
-
|
|
1019
|
+
const query = await client.queryAccounts(filter);
|
|
957
1020
|
assert_1.default.strictEqual(query.length, 0);
|
|
958
1021
|
}
|
|
959
1022
|
});
|
|
@@ -978,8 +1041,8 @@ test('can query transfers', async () => {
|
|
|
978
1041
|
assert_1.default.deepStrictEqual(account_results.length, 1);
|
|
979
1042
|
assert_1.default.ok(account_results[0].timestamp > 0);
|
|
980
1043
|
assert_1.default.deepStrictEqual(account_results[0].status, _1.CreateAccountStatus.created);
|
|
981
|
-
|
|
982
|
-
for (
|
|
1044
|
+
const transfers_created = [];
|
|
1045
|
+
for (let i = 0; i < 10; i++) {
|
|
983
1046
|
transfers_created.push({
|
|
984
1047
|
id: (0, _1.id)(),
|
|
985
1048
|
debit_account_id: i % 2 == 0 ? account.id : accountA.id,
|
|
@@ -1004,7 +1067,7 @@ test('can query transfers', async () => {
|
|
|
1004
1067
|
}
|
|
1005
1068
|
}
|
|
1006
1069
|
{
|
|
1007
|
-
|
|
1070
|
+
const filter = {
|
|
1008
1071
|
user_data_128: 1000n,
|
|
1009
1072
|
user_data_64: 100n,
|
|
1010
1073
|
user_data_32: 10,
|
|
@@ -1015,10 +1078,10 @@ test('can query transfers', async () => {
|
|
|
1015
1078
|
limit: BATCH_MAX,
|
|
1016
1079
|
flags: _1.QueryFilterFlags.none,
|
|
1017
1080
|
};
|
|
1018
|
-
|
|
1081
|
+
const query = await client.queryTransfers(filter);
|
|
1019
1082
|
assert_1.default.strictEqual(query.length, 5);
|
|
1020
|
-
|
|
1021
|
-
for (
|
|
1083
|
+
let timestamp = 0n;
|
|
1084
|
+
for (const transfer of query) {
|
|
1022
1085
|
assert_1.default.ok(timestamp < transfer.timestamp);
|
|
1023
1086
|
timestamp = transfer.timestamp;
|
|
1024
1087
|
assert_1.default.strictEqual(transfer.user_data_128, filter.user_data_128);
|
|
@@ -1029,7 +1092,7 @@ test('can query transfers', async () => {
|
|
|
1029
1092
|
}
|
|
1030
1093
|
}
|
|
1031
1094
|
{
|
|
1032
|
-
|
|
1095
|
+
const filter = {
|
|
1033
1096
|
user_data_128: 2000n,
|
|
1034
1097
|
user_data_64: 200n,
|
|
1035
1098
|
user_data_32: 20,
|
|
@@ -1040,10 +1103,10 @@ test('can query transfers', async () => {
|
|
|
1040
1103
|
limit: BATCH_MAX,
|
|
1041
1104
|
flags: _1.QueryFilterFlags.reversed,
|
|
1042
1105
|
};
|
|
1043
|
-
|
|
1106
|
+
const query = await client.queryTransfers(filter);
|
|
1044
1107
|
assert_1.default.strictEqual(query.length, 5);
|
|
1045
|
-
|
|
1046
|
-
for (
|
|
1108
|
+
let timestamp = 1n << 64n;
|
|
1109
|
+
for (const transfer of query) {
|
|
1047
1110
|
assert_1.default.ok(timestamp > transfer.timestamp);
|
|
1048
1111
|
timestamp = transfer.timestamp;
|
|
1049
1112
|
assert_1.default.strictEqual(transfer.user_data_128, filter.user_data_128);
|
|
@@ -1054,7 +1117,7 @@ test('can query transfers', async () => {
|
|
|
1054
1117
|
}
|
|
1055
1118
|
}
|
|
1056
1119
|
{
|
|
1057
|
-
|
|
1120
|
+
const filter = {
|
|
1058
1121
|
user_data_128: 0n,
|
|
1059
1122
|
user_data_64: 0n,
|
|
1060
1123
|
user_data_32: 0,
|
|
@@ -1065,17 +1128,17 @@ test('can query transfers', async () => {
|
|
|
1065
1128
|
limit: BATCH_MAX,
|
|
1066
1129
|
flags: _1.QueryFilterFlags.none,
|
|
1067
1130
|
};
|
|
1068
|
-
|
|
1131
|
+
const query = await client.queryTransfers(filter);
|
|
1069
1132
|
assert_1.default.strictEqual(query.length, 10);
|
|
1070
|
-
|
|
1071
|
-
for (
|
|
1133
|
+
let timestamp = 0n;
|
|
1134
|
+
for (const transfer of query) {
|
|
1072
1135
|
assert_1.default.ok(timestamp < transfer.timestamp);
|
|
1073
1136
|
timestamp = transfer.timestamp;
|
|
1074
1137
|
assert_1.default.strictEqual(transfer.code, filter.code);
|
|
1075
1138
|
}
|
|
1076
1139
|
}
|
|
1077
1140
|
{
|
|
1078
|
-
|
|
1141
|
+
const filter = {
|
|
1079
1142
|
user_data_128: 0n,
|
|
1080
1143
|
user_data_64: 0n,
|
|
1081
1144
|
user_data_32: 0,
|
|
@@ -1086,10 +1149,10 @@ test('can query transfers', async () => {
|
|
|
1086
1149
|
limit: 5,
|
|
1087
1150
|
flags: _1.QueryFilterFlags.reversed,
|
|
1088
1151
|
};
|
|
1089
|
-
|
|
1152
|
+
let query = await client.queryTransfers(filter);
|
|
1090
1153
|
assert_1.default.strictEqual(query.length, 5);
|
|
1091
|
-
|
|
1092
|
-
for (
|
|
1154
|
+
let timestamp = 1n << 64n;
|
|
1155
|
+
for (const transfer of query) {
|
|
1093
1156
|
assert_1.default.ok(timestamp > transfer.timestamp);
|
|
1094
1157
|
timestamp = transfer.timestamp;
|
|
1095
1158
|
assert_1.default.strictEqual(transfer.code, filter.code);
|
|
@@ -1097,7 +1160,7 @@ test('can query transfers', async () => {
|
|
|
1097
1160
|
filter.timestamp_max = timestamp - 1n;
|
|
1098
1161
|
query = await client.queryTransfers(filter);
|
|
1099
1162
|
assert_1.default.strictEqual(query.length, 5);
|
|
1100
|
-
for (
|
|
1163
|
+
for (const transfer of query) {
|
|
1101
1164
|
assert_1.default.ok(timestamp > transfer.timestamp);
|
|
1102
1165
|
timestamp = transfer.timestamp;
|
|
1103
1166
|
assert_1.default.strictEqual(transfer.code, filter.code);
|
|
@@ -1107,7 +1170,7 @@ test('can query transfers', async () => {
|
|
|
1107
1170
|
assert_1.default.strictEqual(query.length, 0);
|
|
1108
1171
|
}
|
|
1109
1172
|
{
|
|
1110
|
-
|
|
1173
|
+
const filter = {
|
|
1111
1174
|
user_data_128: 0n,
|
|
1112
1175
|
user_data_64: 200n,
|
|
1113
1176
|
user_data_32: 10,
|
|
@@ -1118,7 +1181,7 @@ test('can query transfers', async () => {
|
|
|
1118
1181
|
limit: BATCH_MAX,
|
|
1119
1182
|
flags: _1.QueryFilterFlags.none,
|
|
1120
1183
|
};
|
|
1121
|
-
|
|
1184
|
+
const query = await client.queryTransfers(filter);
|
|
1122
1185
|
assert_1.default.strictEqual(query.length, 0);
|
|
1123
1186
|
}
|
|
1124
1187
|
});
|
|
@@ -1233,7 +1296,7 @@ test('can import accounts and transfers', async () => {
|
|
|
1233
1296
|
let accountLookup = await client.lookupAccounts([accountTmp.id]);
|
|
1234
1297
|
assert_1.default.strictEqual(accountLookup.length, 1);
|
|
1235
1298
|
const timestampMax = accountLookup[0].timestamp;
|
|
1236
|
-
await
|
|
1299
|
+
await sleep_ms(10);
|
|
1237
1300
|
const accountA = {
|
|
1238
1301
|
id: (0, _1.id)(),
|
|
1239
1302
|
debits_pending: 0n,
|
|
@@ -1314,13 +1377,46 @@ test('accept zero-length lookup_transfers', async () => {
|
|
|
1314
1377
|
assert_1.default.deepStrictEqual(transfers, []);
|
|
1315
1378
|
});
|
|
1316
1379
|
test("destroy client in-flight", async () => {
|
|
1317
|
-
const
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1380
|
+
const client_count = 5;
|
|
1381
|
+
const action_count = 50;
|
|
1382
|
+
const clients = range(client_count).map(() => (0, _1.createClient)({
|
|
1383
|
+
cluster_id: 0n,
|
|
1384
|
+
replica_addresses: REPLICA_ADDRESSES,
|
|
1385
|
+
}));
|
|
1386
|
+
const ids = [];
|
|
1387
|
+
const actions = range(action_count).map(() => async () => {
|
|
1388
|
+
await sleep_ms(Math.random() < 0.2 ? 0 : Math.random());
|
|
1389
|
+
const client = clients[random_index(clients)];
|
|
1390
|
+
if (Math.random() < 0.1) {
|
|
1391
|
+
client.destroy();
|
|
1392
|
+
return;
|
|
1393
|
+
}
|
|
1394
|
+
if (Math.random() < 0.7) {
|
|
1395
|
+
const id_new = (0, _1.id)();
|
|
1396
|
+
ids.push(id_new);
|
|
1397
|
+
try {
|
|
1398
|
+
await client.createAccounts([{ ...accountA, id: id_new }]);
|
|
1399
|
+
}
|
|
1400
|
+
catch (err) {
|
|
1401
|
+
assert_1.default.ok(err instanceof _1.RequestError);
|
|
1402
|
+
assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_CLIENT_CLOSED);
|
|
1403
|
+
}
|
|
1404
|
+
return;
|
|
1405
|
+
}
|
|
1406
|
+
try {
|
|
1407
|
+
const id_lookup = (Math.random() < 0.2 || ids.length == 0)
|
|
1408
|
+
? BigInt(Math.floor(Math.random() * 10000))
|
|
1409
|
+
: ids[random_index(ids)];
|
|
1410
|
+
await client.lookupAccounts([id_lookup]);
|
|
1411
|
+
}
|
|
1412
|
+
catch (err) {
|
|
1413
|
+
assert_1.default.ok(err instanceof _1.RequestError);
|
|
1414
|
+
assert_1.default.strictEqual(err.code, _1.ErrorCodes.ERR_CLIENT_CLOSED);
|
|
1415
|
+
}
|
|
1323
1416
|
});
|
|
1417
|
+
await Promise.all(actions.map((f) => f()));
|
|
1418
|
+
for (const client of clients)
|
|
1419
|
+
client.destroy();
|
|
1324
1420
|
});
|
|
1325
1421
|
async function main() {
|
|
1326
1422
|
const start = new Date().getTime();
|