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.
- package/README.md +9 -7
- package/built/cjs/index.js +235 -118
- package/built/cjs/index.js.map +1 -1
- package/built/esm/index.js +19045 -17598
- package/built/esm/index.js.map +1 -1
- package/built/mocks/handlers.d.ts +8 -8
- package/built/mocks/handlers.js +4 -2
- package/built/mocks/handlers.js.map +1 -1
- package/built/mocks/servers.d.ts +1 -1
- package/built/resources/testData.d.ts +1 -2
- package/built/src/ICCF/IccfProofTxMaterialBuilder.d.ts +0 -1
- package/built/src/ICCF/IccfProofTxMaterialBuilder.js +3 -2
- package/built/src/ICCF/IccfProofTxMaterialBuilder.js.map +1 -1
- package/built/src/ICCF/error.d.ts +0 -1
- package/built/src/ICCF/interfaces.d.ts +0 -1
- package/built/src/ICCF/types.d.ts +0 -1
- package/built/src/ICCF/utils.d.ts +0 -1
- package/built/src/ICCF/utils.js +3 -1
- package/built/src/ICCF/utils.js.map +1 -1
- package/built/src/blockchainClient/blockchainClient.js +10 -10
- package/built/src/blockchainClient/blockchainClient.js.map +1 -1
- package/built/src/blockchainClient/errors.d.ts +0 -1
- package/built/src/blockchainClient/failoverStrategies.d.ts +5 -4
- package/built/src/blockchainClient/failoverStrategies.js +93 -55
- package/built/src/blockchainClient/failoverStrategies.js.map +1 -1
- package/built/src/blockchainClient/httpUtil.d.ts +0 -1
- package/built/src/blockchainClient/httpUtil.js +7 -2
- package/built/src/blockchainClient/httpUtil.js.map +1 -1
- package/built/src/blockchainClient/interface.d.ts +0 -1
- package/built/src/blockchainClient/nodeManager.d.ts +10 -7
- package/built/src/blockchainClient/nodeManager.js +47 -20
- package/built/src/blockchainClient/nodeManager.js.map +1 -1
- package/built/src/blockchainClient/requestWithFailoverStrategy.d.ts +0 -1
- package/built/src/blockchainClient/requestWithFailoverStrategy.js +2 -2
- package/built/src/blockchainClient/requestWithFailoverStrategy.js.map +1 -1
- package/built/src/blockchainClient/types.d.ts +2 -1
- package/built/src/blockchainClient/utils.d.ts +1 -2
- package/built/src/blockchainClient/utils.js +20 -15
- package/built/src/blockchainClient/utils.js.map +1 -1
- package/built/src/blockchainClient/validation/anchoringTransaction.d.ts +6 -7
- package/built/src/blockchainClient/validation/blockIdentifier.d.ts +2 -2
- package/built/src/blockchainClient/validation/blockIdentifier.js +4 -4
- package/built/src/blockchainClient/validation/blockIdentifier.js.map +1 -1
- package/built/src/blockchainClient/validation/bufferSchema.d.ts +1 -2
- package/built/src/blockchainClient/validation/networkSettings.d.ts +2 -2
- package/built/src/blockchainClient/validation/networkSettings.js +2 -2
- package/built/src/blockchainClient/validation/networkSettings.js.map +1 -1
- package/built/src/blockchainClient/validation/signMethod.d.ts +12 -13
- package/built/src/blockchainClient/validation/txRid.d.ts +1 -2
- package/built/src/encryption/encryption.d.ts +0 -1
- package/built/src/encryption/errors.d.ts +0 -1
- package/built/src/encryption/types.d.ts +0 -1
- package/built/src/formatter.d.ts +1 -2
- package/built/src/formatter.js +3 -4
- package/built/src/formatter.js.map +1 -1
- package/built/src/gtv/index.d.ts +1 -2
- package/built/src/gtv/types.d.ts +0 -1
- package/built/src/gtx/gtx.d.ts +0 -1
- package/built/src/gtx/gtx.js +2 -1
- package/built/src/gtx/gtx.js.map +1 -1
- package/built/src/gtx/serialization.d.ts +0 -1
- package/built/src/gtx/types.d.ts +0 -1
- package/built/src/utils/bufferUtils.d.ts +6 -0
- package/built/src/utils/bufferUtils.js +9 -0
- package/built/src/utils/bufferUtils.js.map +1 -0
- package/built/src/utils/calculateTransactionRid.d.ts +0 -1
- package/built/src/utils/decodeTransactionToGtx.d.ts +0 -1
- package/built/src/utils/encodeTransaction.d.ts +0 -1
- package/built/src/utils/http-utils.d.ts +19 -0
- package/built/src/utils/http-utils.js +36 -0
- package/built/src/utils/http-utils.js.map +1 -0
- package/built/test/common/mocks.d.ts +23 -24
- package/built/test/common/setups.d.ts +3 -4
- package/built/test/common/signatures.d.ts +9 -10
- package/built/test/common/validationMocks.d.ts +2 -3
- package/built/test/integration/clientQuery.test.js.map +1 -1
- package/built/test/integration/clientSendTransaction.test.js +1 -1
- package/built/test/integration/clientSendTransaction.test.js.map +1 -1
- package/built/test/integration/createClientIntegration.test.js +5 -21
- package/built/test/integration/createClientIntegration.test.js.map +1 -1
- package/built/test/integration/failoverStrategiesWithSmartTimeouts.test.d.ts +1 -0
- package/built/test/integration/failoverStrategiesWithSmartTimeouts.test.js +140 -0
- package/built/test/integration/failoverStrategiesWithSmartTimeouts.test.js.map +1 -0
- package/built/test/manual/iccfManually.test.js +2 -2
- package/built/test/manual/iccfManually.test.js.map +1 -1
- package/built/test/pcctf/helpers.js +2 -2
- package/built/test/pcctf/helpers.js.map +1 -1
- package/built/test/unit/ICCF/iccf.test.js +7 -4
- package/built/test/unit/ICCF/iccf.test.js.map +1 -1
- package/built/test/unit/ICCF/iccfProofMaterialBuilder.test.js +2 -2
- package/built/test/unit/failoverStrategies.test.js +36 -15
- package/built/test/unit/failoverStrategies.test.js.map +1 -1
- package/built/test/unit/networkErrorDetection.test.d.ts +1 -0
- package/built/test/unit/networkErrorDetection.test.js +433 -0
- package/built/test/unit/networkErrorDetection.test.js.map +1 -0
- package/built/test/unit/nodeMananger.test.js +3 -2
- package/built/test/unit/nodeMananger.test.js.map +1 -1
- package/built/test/unit/smartTimeouts.test.d.ts +1 -0
- package/built/test/unit/smartTimeouts.test.js +296 -0
- package/built/test/unit/smartTimeouts.test.js.map +1 -0
- package/built/test/unit/stickyNode.test.js +13 -13
- package/built/test/unit/stickyNode.test.js.map +1 -1
- package/built/test/unit/universalNodeRecovery.test.d.ts +1 -0
- package/built/test/unit/universalNodeRecovery.test.js +283 -0
- package/built/test/unit/universalNodeRecovery.test.js.map +1 -0
- package/built/umd/index.js +19070 -17625
- package/built/umd/index.js.map +1 -1
- package/changelog.md +31 -1
- 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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAE9B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;gBACrC,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,8EAA8E;YAC9E,+EAA+E;YAC/E,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,sEAAsE;YACtE,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,0CAA0C;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;gBAC9C,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,8EAA8E;YAC9E,uCAAuC;YACvC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,iDAAiD;YACjD,IAAI,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEvC,gDAAgD;YAChD,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,0CAA0C;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;gBACvD,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,8EAA8E;YAC9E,uCAAuC;YACvC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,iDAAiD;YACjD,IAAI,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEvC,gDAAgD;YAChD,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,0CAA0C;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,+EAA+E;YAC/E,uCAAuC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,iDAAiD;YACjD,IAAI,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEvC,gDAAgD;YAChD,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,0CAA0C;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;YACvF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtE,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,mFAAmF;YACnF,uCAAuC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,iDAAiD;YACjD,IAAI,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEvC,gDAAgD;YAChD,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,0CAA0C;QACrF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;YACzF,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;gBACpB,mBAAmB,EAAE,KAAK;aAC3B,CAAC,CAAC;YAEH,wDAAwD;YACxD,qDAAqD;YACrD,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEvD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,sCAAsC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC5B,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEvD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,iBAAiB;YACjB,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CACV,WAAW;qBACR,iBAAiB,EAAE;qBACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;qBACf,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;YACJ,CAAC;YAED,0DAA0D;YAC1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,kDAAkD;YAClD,MAAM,sBAAsB,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,oCAAoC;YAEpC,mEAAmE;YACnE,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,qDAAqD;YACrD,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;YAC7E,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,sCAAsC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAEtC,iBAAiB;YACjB,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEvD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,cAAc,CAAC,2CAA2C,CAAC,CACnE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;;YAC7D,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChD,WAAW,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YAE9C,6CAA6C;YAC7C,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,0CAA0C;YAC1C,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEhC,kCAAkC;YAClC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACzD,MAAM,CAAC,MAAA,WAAW,CAAC,WAAW,0CAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjD,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YAE/C,iBAAiB;YACjB,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEhC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAC1C,MAAM,CAAC,cAAc,CAAC,2CAA2C,CAAC,CACnE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,iBAAiB;YACjB,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEhC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,sCAAsC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAEtC,iBAAiB;YACjB,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACzC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEzC,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAEhC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,0CAA0C,UAAU,EAAE,CACvD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,6BAA6B;YAC7B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9D,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,kEAAkE;YAClE,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB;YAChE,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,eAAe;YAChE,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB;YAEjE,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;YACjF,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,QAAQ;gBACR,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,iBAAiB;YACjB,WAAW,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;YACrD,WAAW,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;YAErD,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAElE,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|