postchain-client 2.0.4 → 2.1.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 (109) hide show
  1. package/README.md +9 -7
  2. package/built/cjs/index.js +235 -118
  3. package/built/cjs/index.js.map +1 -1
  4. package/built/esm/index.js +19045 -17598
  5. package/built/esm/index.js.map +1 -1
  6. package/built/mocks/handlers.d.ts +8 -8
  7. package/built/mocks/handlers.js +4 -2
  8. package/built/mocks/handlers.js.map +1 -1
  9. package/built/mocks/servers.d.ts +1 -1
  10. package/built/resources/testData.d.ts +1 -2
  11. package/built/src/ICCF/IccfProofTxMaterialBuilder.d.ts +0 -1
  12. package/built/src/ICCF/IccfProofTxMaterialBuilder.js +3 -2
  13. package/built/src/ICCF/IccfProofTxMaterialBuilder.js.map +1 -1
  14. package/built/src/ICCF/error.d.ts +0 -1
  15. package/built/src/ICCF/interfaces.d.ts +0 -1
  16. package/built/src/ICCF/types.d.ts +0 -1
  17. package/built/src/ICCF/utils.d.ts +0 -1
  18. package/built/src/ICCF/utils.js +3 -1
  19. package/built/src/ICCF/utils.js.map +1 -1
  20. package/built/src/blockchainClient/blockchainClient.js +10 -10
  21. package/built/src/blockchainClient/blockchainClient.js.map +1 -1
  22. package/built/src/blockchainClient/errors.d.ts +0 -1
  23. package/built/src/blockchainClient/failoverStrategies.d.ts +5 -4
  24. package/built/src/blockchainClient/failoverStrategies.js +93 -55
  25. package/built/src/blockchainClient/failoverStrategies.js.map +1 -1
  26. package/built/src/blockchainClient/httpUtil.d.ts +0 -1
  27. package/built/src/blockchainClient/httpUtil.js +7 -2
  28. package/built/src/blockchainClient/httpUtil.js.map +1 -1
  29. package/built/src/blockchainClient/interface.d.ts +0 -1
  30. package/built/src/blockchainClient/nodeManager.d.ts +10 -7
  31. package/built/src/blockchainClient/nodeManager.js +47 -20
  32. package/built/src/blockchainClient/nodeManager.js.map +1 -1
  33. package/built/src/blockchainClient/requestWithFailoverStrategy.d.ts +0 -1
  34. package/built/src/blockchainClient/requestWithFailoverStrategy.js +2 -2
  35. package/built/src/blockchainClient/requestWithFailoverStrategy.js.map +1 -1
  36. package/built/src/blockchainClient/types.d.ts +2 -1
  37. package/built/src/blockchainClient/utils.d.ts +1 -2
  38. package/built/src/blockchainClient/utils.js +20 -15
  39. package/built/src/blockchainClient/utils.js.map +1 -1
  40. package/built/src/blockchainClient/validation/anchoringTransaction.d.ts +6 -7
  41. package/built/src/blockchainClient/validation/blockIdentifier.d.ts +2 -2
  42. package/built/src/blockchainClient/validation/blockIdentifier.js +4 -4
  43. package/built/src/blockchainClient/validation/blockIdentifier.js.map +1 -1
  44. package/built/src/blockchainClient/validation/bufferSchema.d.ts +1 -2
  45. package/built/src/blockchainClient/validation/networkSettings.d.ts +2 -2
  46. package/built/src/blockchainClient/validation/networkSettings.js +2 -2
  47. package/built/src/blockchainClient/validation/networkSettings.js.map +1 -1
  48. package/built/src/blockchainClient/validation/signMethod.d.ts +12 -13
  49. package/built/src/blockchainClient/validation/txRid.d.ts +1 -2
  50. package/built/src/encryption/encryption.d.ts +0 -1
  51. package/built/src/encryption/errors.d.ts +0 -1
  52. package/built/src/encryption/types.d.ts +0 -1
  53. package/built/src/formatter.d.ts +1 -2
  54. package/built/src/formatter.js +3 -4
  55. package/built/src/formatter.js.map +1 -1
  56. package/built/src/gtv/index.d.ts +1 -2
  57. package/built/src/gtv/types.d.ts +0 -1
  58. package/built/src/gtx/gtx.d.ts +0 -1
  59. package/built/src/gtx/gtx.js +2 -1
  60. package/built/src/gtx/gtx.js.map +1 -1
  61. package/built/src/gtx/serialization.d.ts +0 -1
  62. package/built/src/gtx/types.d.ts +0 -1
  63. package/built/src/utils/bufferUtils.d.ts +6 -0
  64. package/built/src/utils/bufferUtils.js +9 -0
  65. package/built/src/utils/bufferUtils.js.map +1 -0
  66. package/built/src/utils/calculateTransactionRid.d.ts +0 -1
  67. package/built/src/utils/decodeTransactionToGtx.d.ts +0 -1
  68. package/built/src/utils/encodeTransaction.d.ts +0 -1
  69. package/built/src/utils/http-utils.d.ts +19 -0
  70. package/built/src/utils/http-utils.js +36 -0
  71. package/built/src/utils/http-utils.js.map +1 -0
  72. package/built/test/common/mocks.d.ts +23 -24
  73. package/built/test/common/setups.d.ts +3 -4
  74. package/built/test/common/signatures.d.ts +9 -10
  75. package/built/test/common/validationMocks.d.ts +2 -3
  76. package/built/test/integration/clientQuery.test.js.map +1 -1
  77. package/built/test/integration/clientSendTransaction.test.js +1 -1
  78. package/built/test/integration/clientSendTransaction.test.js.map +1 -1
  79. package/built/test/integration/createClientIntegration.test.js +5 -21
  80. package/built/test/integration/createClientIntegration.test.js.map +1 -1
  81. package/built/test/integration/failoverStrategiesWithSmartTimeouts.test.d.ts +1 -0
  82. package/built/test/integration/failoverStrategiesWithSmartTimeouts.test.js +140 -0
  83. package/built/test/integration/failoverStrategiesWithSmartTimeouts.test.js.map +1 -0
  84. package/built/test/manual/iccfManually.test.js +2 -2
  85. package/built/test/manual/iccfManually.test.js.map +1 -1
  86. package/built/test/pcctf/helpers.js +2 -2
  87. package/built/test/pcctf/helpers.js.map +1 -1
  88. package/built/test/unit/ICCF/iccf.test.js +7 -4
  89. package/built/test/unit/ICCF/iccf.test.js.map +1 -1
  90. package/built/test/unit/ICCF/iccfProofMaterialBuilder.test.js +2 -2
  91. package/built/test/unit/failoverStrategies.test.js +36 -15
  92. package/built/test/unit/failoverStrategies.test.js.map +1 -1
  93. package/built/test/unit/networkErrorDetection.test.d.ts +1 -0
  94. package/built/test/unit/networkErrorDetection.test.js +433 -0
  95. package/built/test/unit/networkErrorDetection.test.js.map +1 -0
  96. package/built/test/unit/nodeMananger.test.js +3 -2
  97. package/built/test/unit/nodeMananger.test.js.map +1 -1
  98. package/built/test/unit/smartTimeouts.test.d.ts +1 -0
  99. package/built/test/unit/smartTimeouts.test.js +296 -0
  100. package/built/test/unit/smartTimeouts.test.js.map +1 -0
  101. package/built/test/unit/stickyNode.test.js +13 -13
  102. package/built/test/unit/stickyNode.test.js.map +1 -1
  103. package/built/test/unit/universalNodeRecovery.test.d.ts +1 -0
  104. package/built/test/unit/universalNodeRecovery.test.js +283 -0
  105. package/built/test/unit/universalNodeRecovery.test.js.map +1 -0
  106. package/built/umd/index.js +19070 -17625
  107. package/built/umd/index.js.map +1 -1
  108. package/changelog.md +31 -1
  109. package/package.json +11 -8
@@ -0,0 +1,283 @@
1
+ import { createNodeManager } from "../../src/blockchainClient/nodeManager";
2
+ import * as logger from "../../src/logger";
3
+ jest.mock("../../src/logger");
4
+ describe("Universal Node Recovery", () => {
5
+ beforeEach(() => {
6
+ jest.clearAllMocks();
7
+ });
8
+ describe("BFT Threshold Calculation", () => {
9
+ it("should calculate correct recovery threshold for 3 nodes (default 2x formula)", () => {
10
+ const nodeManager = createNodeManager({
11
+ nodeUrls: ["node1", "node2", "node3"],
12
+ useStickyNode: false,
13
+ });
14
+ // Threshold = 3 - Math.floor(2 * (3-1) / 3) = 3 - Math.floor(4/3) = 3 - 1 = 2
15
+ // Recovery triggers when available < 2, so triggers when only 1 node available
16
+ nodeManager.makeNodeUnavailable("node1");
17
+ nodeManager.makeNodeUnavailable("node2");
18
+ // Only 1 available < 2 threshold, should trigger recovery immediately
19
+ const availableNodes = nodeManager.getAvailableNodes();
20
+ expect(availableNodes).toHaveLength(3); // Recovery triggered, all nodes available
21
+ });
22
+ it("should calculate correct recovery threshold for 4 nodes (default 2x formula)", () => {
23
+ const nodeManager = createNodeManager({
24
+ nodeUrls: ["node1", "node2", "node3", "node4"],
25
+ useStickyNode: false,
26
+ });
27
+ // Threshold = 4 - Math.floor(2 * (4-1) / 3) = 4 - Math.floor(6/3) = 4 - 2 = 2
28
+ // Recovery triggers when available < 2
29
+ nodeManager.makeNodeUnavailable("node1");
30
+ nodeManager.makeNodeUnavailable("node2");
31
+ // Still 2 available, should not trigger recovery
32
+ let availableNodes = nodeManager.getAvailableNodes();
33
+ expect(availableNodes).toHaveLength(2);
34
+ // Make one more unavailable to trigger recovery
35
+ nodeManager.makeNodeUnavailable("node3");
36
+ availableNodes = nodeManager.getAvailableNodes();
37
+ expect(availableNodes).toHaveLength(4); // Recovery triggered, all nodes available
38
+ });
39
+ it("should calculate correct recovery threshold for 5 nodes (default 2x formula)", () => {
40
+ const nodeManager = createNodeManager({
41
+ nodeUrls: ["node1", "node2", "node3", "node4", "node5"],
42
+ useStickyNode: false,
43
+ });
44
+ // Threshold = 5 - Math.floor(2 * (5-1) / 3) = 5 - Math.floor(8/3) = 5 - 2 = 3
45
+ // Recovery triggers when available < 3
46
+ nodeManager.makeNodeUnavailable("node1");
47
+ nodeManager.makeNodeUnavailable("node2");
48
+ // Still 3 available, should not trigger recovery
49
+ let availableNodes = nodeManager.getAvailableNodes();
50
+ expect(availableNodes).toHaveLength(3);
51
+ // Make one more unavailable to trigger recovery
52
+ nodeManager.makeNodeUnavailable("node3");
53
+ availableNodes = nodeManager.getAvailableNodes();
54
+ expect(availableNodes).toHaveLength(5); // Recovery triggered, all nodes available
55
+ });
56
+ it("should calculate correct recovery threshold for 7 nodes (default 2x formula)", () => {
57
+ const nodeUrls = Array.from({ length: 7 }, (_, i) => `node${i + 1}`);
58
+ const nodeManager = createNodeManager({
59
+ nodeUrls,
60
+ useStickyNode: false,
61
+ });
62
+ // Threshold = 7 - Math.floor(2 * (7-1) / 3) = 7 - Math.floor(12/3) = 7 - 4 = 3
63
+ // Recovery triggers when available < 3
64
+ for (let i = 0; i < 4; i++) {
65
+ nodeManager.makeNodeUnavailable(nodeUrls[i]);
66
+ }
67
+ // Still 3 available, should not trigger recovery
68
+ let availableNodes = nodeManager.getAvailableNodes();
69
+ expect(availableNodes).toHaveLength(3);
70
+ // Make one more unavailable to trigger recovery
71
+ nodeManager.makeNodeUnavailable(nodeUrls[4]);
72
+ availableNodes = nodeManager.getAvailableNodes();
73
+ expect(availableNodes).toHaveLength(7); // Recovery triggered, all nodes available
74
+ });
75
+ it("should calculate correct recovery threshold for 10 nodes (default 2x formula)", () => {
76
+ const nodeUrls = Array.from({ length: 10 }, (_, i) => `node${i + 1}`);
77
+ const nodeManager = createNodeManager({
78
+ nodeUrls,
79
+ useStickyNode: false,
80
+ });
81
+ // Threshold = 10 - Math.floor(2 * (10-1) / 3) = 10 - Math.floor(18/3) = 10 - 6 = 4
82
+ // Recovery triggers when available < 4
83
+ for (let i = 0; i < 6; i++) {
84
+ nodeManager.makeNodeUnavailable(nodeUrls[i]);
85
+ }
86
+ // Still 4 available, should not trigger recovery
87
+ let availableNodes = nodeManager.getAvailableNodes();
88
+ expect(availableNodes).toHaveLength(4);
89
+ // Make one more unavailable to trigger recovery
90
+ nodeManager.makeNodeUnavailable(nodeUrls[6]);
91
+ availableNodes = nodeManager.getAvailableNodes();
92
+ expect(availableNodes).toHaveLength(10); // Recovery triggered, all nodes available
93
+ });
94
+ });
95
+ describe("Auto Recovery Behavior", () => {
96
+ it("should trigger auto-recovery when available nodes drop below recovery threshold", () => {
97
+ const nodeUrls = ["node1", "node2", "node3", "node4", "node5"];
98
+ const nodeManager = createNodeManager({
99
+ nodeUrls,
100
+ useStickyNode: false,
101
+ unavailableDuration: 30000,
102
+ });
103
+ // Threshold = 5 - Math.floor(2 * (5-1) / 3) = 5 - 2 = 3
104
+ // Make nodes unavailable until below threshold (< 3)
105
+ nodeManager.makeNodeUnavailable("node1");
106
+ nodeManager.makeNodeUnavailable("node2");
107
+ nodeManager.makeNodeUnavailable("node3");
108
+ const availableNodes = nodeManager.getAvailableNodes();
109
+ expect(availableNodes).toHaveLength(5);
110
+ expect(logger.debug).toHaveBeenCalledWith("Auto-recovery: 2 < 3 nodes (5 total)");
111
+ });
112
+ it("should not trigger auto-recovery for networks with less than 3 nodes", () => {
113
+ const nodeManager = createNodeManager({
114
+ nodeUrls: ["node1", "node2"],
115
+ useStickyNode: false,
116
+ });
117
+ nodeManager.makeNodeUnavailable("node1");
118
+ const availableNodes = nodeManager.getAvailableNodes();
119
+ expect(availableNodes).toHaveLength(1);
120
+ expect(logger.debug).not.toHaveBeenCalled();
121
+ });
122
+ it("should shuffle nodes after recovery", () => {
123
+ const nodeUrls = ["node1", "node2", "node3", "node4"];
124
+ const nodeManager = createNodeManager({
125
+ nodeUrls,
126
+ useStickyNode: false,
127
+ });
128
+ // Force recovery
129
+ nodeManager.makeNodeUnavailable("node1");
130
+ nodeManager.makeNodeUnavailable("node2");
131
+ nodeManager.makeNodeUnavailable("node3");
132
+ const results = [];
133
+ for (let i = 0; i < 5; i++) {
134
+ results.push(nodeManager
135
+ .getAvailableNodes()
136
+ .map(n => n.url)
137
+ .join(","));
138
+ }
139
+ // Should have some variation in ordering due to shuffling
140
+ const uniqueOrderings = new Set(results);
141
+ expect(uniqueOrderings.size).toBeGreaterThan(1);
142
+ });
143
+ it("should use custom threshold when provided", () => {
144
+ const nodeUrls = ["node1", "node2", "node3", "node4", "node5"];
145
+ const nodeManager = createNodeManager({
146
+ nodeUrls,
147
+ useStickyNode: false,
148
+ });
149
+ // Use QueryMajority threshold (less conservative)
150
+ const queryMajorityThreshold = nodeUrls.length - Math.floor((nodeUrls.length - 1) / 3);
151
+ // = 5 - Math.floor(4/3) = 5 - 1 = 4
152
+ // Make nodes unavailable until below QueryMajority threshold (< 4)
153
+ nodeManager.makeNodeUnavailable("node1");
154
+ nodeManager.makeNodeUnavailable("node2");
155
+ // 3 available < 4 threshold, should trigger recovery
156
+ const availableNodes = nodeManager.getAvailableNodes(queryMajorityThreshold);
157
+ expect(availableNodes).toHaveLength(5);
158
+ expect(logger.debug).toHaveBeenCalledWith("Auto-recovery: 3 < 4 nodes (5 total)");
159
+ });
160
+ });
161
+ describe("Sticky Node Preservation", () => {
162
+ it("should preserve sticky node during recovery", () => {
163
+ const nodeUrls = ["node1", "node2", "node3", "node4"];
164
+ const nodeManager = createNodeManager({
165
+ nodeUrls,
166
+ useStickyNode: true,
167
+ });
168
+ const stickyNode = nodeManager.nodes[3];
169
+ nodeManager.setStickyNode(stickyNode);
170
+ // Force recovery
171
+ nodeManager.makeNodeUnavailable("node1");
172
+ nodeManager.makeNodeUnavailable("node2");
173
+ nodeManager.makeNodeUnavailable("node3");
174
+ const availableNodes = nodeManager.getAvailableNodes();
175
+ expect(availableNodes).toHaveLength(4);
176
+ expect(nodeManager.stickedNode).toBe(stickyNode);
177
+ expect(logger.info).toHaveBeenCalledWith(expect.stringMatching(/Sticky node preserved during recovery: .*/));
178
+ });
179
+ it("should restore sticky node reference after recovery", () => {
180
+ var _a;
181
+ const nodeUrls = ["node1", "node2", "node3", "node4"];
182
+ const nodeManager = createNodeManager({
183
+ nodeUrls,
184
+ useStickyNode: true,
185
+ });
186
+ const originalStickyNode = nodeManager.nodes[0];
187
+ nodeManager.setStickyNode(originalStickyNode);
188
+ // Force recovery by making nodes unavailable
189
+ nodeManager.makeNodeUnavailable("node2");
190
+ nodeManager.makeNodeUnavailable("node3");
191
+ nodeManager.makeNodeUnavailable("node4");
192
+ // Get available nodes to trigger recovery
193
+ nodeManager.getAvailableNodes();
194
+ // Verify sticky node is preserved
195
+ expect(nodeManager.stickedNode).toBe(originalStickyNode);
196
+ expect((_a = nodeManager.stickedNode) === null || _a === void 0 ? void 0 : _a.url).toBe("node1");
197
+ });
198
+ it("should not preserve sticky node when sticky mode is disabled", () => {
199
+ const nodeUrls = ["node1", "node2", "node3", "node4"];
200
+ const nodeManager = createNodeManager({
201
+ nodeUrls,
202
+ useStickyNode: false,
203
+ });
204
+ const potentialStickyNode = nodeManager.nodes[0];
205
+ nodeManager.setStickyNode(potentialStickyNode);
206
+ // Force recovery
207
+ nodeManager.makeNodeUnavailable("node1");
208
+ nodeManager.makeNodeUnavailable("node2");
209
+ nodeManager.makeNodeUnavailable("node3");
210
+ nodeManager.getAvailableNodes();
211
+ expect(logger.info).not.toHaveBeenCalledWith(expect.stringMatching(/Sticky node preserved during recovery: .*/));
212
+ });
213
+ });
214
+ describe("Recovery Logging", () => {
215
+ it("should log detailed recovery information", () => {
216
+ const nodeUrls = ["node1", "node2", "node3", "node4", "node5"];
217
+ const nodeManager = createNodeManager({
218
+ nodeUrls,
219
+ useStickyNode: false,
220
+ });
221
+ // Force recovery
222
+ nodeManager.makeNodeUnavailable("node1");
223
+ nodeManager.makeNodeUnavailable("node2");
224
+ nodeManager.makeNodeUnavailable("node3");
225
+ nodeManager.getAvailableNodes();
226
+ expect(logger.debug).toHaveBeenCalledWith("Auto-recovery: 2 < 3 nodes (5 total)");
227
+ });
228
+ it("should log sticky node preservation", () => {
229
+ const nodeUrls = ["node1", "node2", "node3"];
230
+ const nodeManager = createNodeManager({
231
+ nodeUrls,
232
+ useStickyNode: true,
233
+ });
234
+ const stickyNode = nodeManager.nodes[0];
235
+ nodeManager.setStickyNode(stickyNode);
236
+ // Force recovery
237
+ nodeManager.makeNodeUnavailable("node2");
238
+ nodeManager.makeNodeUnavailable("node3");
239
+ nodeManager.getAvailableNodes();
240
+ expect(logger.info).toHaveBeenCalledWith(`Sticky node preserved during recovery: ${stickyNode}`);
241
+ });
242
+ });
243
+ describe("Recovery Edge Cases", () => {
244
+ it("should handle recovery when all nodes are unavailable", () => {
245
+ const nodeUrls = ["node1", "node2", "node3"];
246
+ const nodeManager = createNodeManager({
247
+ nodeUrls,
248
+ useStickyNode: false,
249
+ });
250
+ // Make all nodes unavailable
251
+ nodeUrls.forEach(url => nodeManager.makeNodeUnavailable(url));
252
+ const availableNodes = nodeManager.getAvailableNodes();
253
+ expect(availableNodes).toHaveLength(3);
254
+ });
255
+ it("should handle recovery with mixed node states", () => {
256
+ const nodeUrls = ["node1", "node2", "node3", "node4", "node5"];
257
+ const nodeManager = createNodeManager({
258
+ nodeUrls,
259
+ useStickyNode: false,
260
+ });
261
+ // Create mixed states - some recently failed, some older failures
262
+ nodeManager.makeNodeUnavailable("node1", 1000); // Short timeout
263
+ nodeManager.makeNodeUnavailable("node2", 60000); // Long timeout
264
+ nodeManager.makeNodeUnavailable("node3", 5000); // Medium timeout
265
+ const availableNodes = nodeManager.getAvailableNodes();
266
+ expect(availableNodes).toHaveLength(5); // All recovered
267
+ });
268
+ it("should maintain node URL integrity after recovery", () => {
269
+ const nodeUrls = ["http://node1:8080", "http://node2:8080", "http://node3:8080"];
270
+ const nodeManager = createNodeManager({
271
+ nodeUrls,
272
+ useStickyNode: false,
273
+ });
274
+ // Force recovery
275
+ nodeManager.makeNodeUnavailable("http://node1:8080");
276
+ nodeManager.makeNodeUnavailable("http://node2:8080");
277
+ const availableNodes = nodeManager.getAvailableNodes();
278
+ const recoveredUrls = availableNodes.map(node => node.url).sort();
279
+ expect(recoveredUrls).toEqual(nodeUrls.sort());
280
+ });
281
+ });
282
+ });
283
+ //# sourceMappingURL=universalNodeRecovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universalNodeRecovery.test.js","sourceRoot":"","sources":["../../../test/unit/universalNodeRecovery.test.ts"],"names":[],"mappings":"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"}