@dignetwork/dig-sdk 0.0.1-alpha.104 → 0.0.1-alpha.107
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/DataIntegrityTree/DataIntegrityTree.d.ts +6 -1
- package/dist/DataIntegrityTree/DataIntegrityTree.d.ts.map +1 -1
- package/dist/DataIntegrityTree/DataIntegrityTree.js +51 -25
- package/dist/DigNetwork/PropagationServer.d.ts +1 -1
- package/dist/DigNetwork/PropagationServer.d.ts.map +1 -1
- package/dist/DigNetwork/PropagationServer.js +44 -8
- package/dist/blockchain/DataStore.d.ts +1 -1
- package/dist/blockchain/DataStore.d.ts.map +1 -1
- package/dist/blockchain/DataStore.js +22 -38
- package/dist/blockchain/StoreInfoCacheUpdater.d.ts +10 -0
- package/dist/blockchain/StoreInfoCacheUpdater.d.ts.map +1 -0
- package/dist/blockchain/StoreInfoCacheUpdater.js +66 -0
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/{asyncPool.d.ts → promiseUtils.d.ts} +9 -1
- package/dist/utils/promiseUtils.d.ts.map +1 -0
- package/dist/utils/{asyncPool.js → promiseUtils.js} +15 -0
- package/package.json +1 -1
- package/dist/utils/asyncPool.d.ts.map +0 -1
|
@@ -155,9 +155,14 @@ declare class DataIntegrityTree {
|
|
|
155
155
|
* @param sha256 - The SHA-256 hash of the file.
|
|
156
156
|
* @param serializedTree - The foreign serialized Merkle tree.
|
|
157
157
|
* @param expectedRootHash - The expected root hash of the Merkle tree.
|
|
158
|
+
* @param dataDir - The directory where the data is stored.
|
|
159
|
+
* @param verifiedSha256 - A boolean indicating if the SHA-256 hash has already been verified.
|
|
158
160
|
* @returns A boolean indicating if the SHA-256 is present in the foreign tree and the root hash matches.
|
|
159
161
|
*/
|
|
160
|
-
static validateKeyIntegrityWithForeignTree(hexkey: string, sha256: string, serializedTree: object, expectedRootHash: string, dataDir: string): Promise<boolean>;
|
|
162
|
+
static validateKeyIntegrityWithForeignTree(hexkey: string, sha256: string, serializedTree: object, expectedRootHash: string, dataDir: string, verifiedSha256?: boolean): Promise<boolean>;
|
|
163
|
+
private static verifyFileHash;
|
|
164
|
+
private static deserializeAndVerifyTree;
|
|
165
|
+
private static checkHashInTree;
|
|
161
166
|
}
|
|
162
167
|
export { DataIntegrityTree };
|
|
163
168
|
//# sourceMappingURL=DataIntegrityTree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataIntegrityTree.d.ts","sourceRoot":"","sources":["../../src/DataIntegrityTree/DataIntegrityTree.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"DataIntegrityTree.d.ts","sourceRoot":"","sources":["../../src/DataIntegrityTree/DataIntegrityTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -638,9 +638,11 @@ class DataIntegrityTree {
|
|
|
638
638
|
* @param sha256 - The SHA-256 hash of the file.
|
|
639
639
|
* @param serializedTree - The foreign serialized Merkle tree.
|
|
640
640
|
* @param expectedRootHash - The expected root hash of the Merkle tree.
|
|
641
|
+
* @param dataDir - The directory where the data is stored.
|
|
642
|
+
* @param verifiedSha256 - A boolean indicating if the SHA-256 hash has already been verified.
|
|
641
643
|
* @returns A boolean indicating if the SHA-256 is present in the foreign tree and the root hash matches.
|
|
642
644
|
*/
|
|
643
|
-
static async validateKeyIntegrityWithForeignTree(hexkey, sha256, serializedTree, expectedRootHash, dataDir) {
|
|
645
|
+
static async validateKeyIntegrityWithForeignTree(hexkey, sha256, serializedTree, expectedRootHash, dataDir, verifiedSha256 = false) {
|
|
644
646
|
if (!isHexString(hexkey)) {
|
|
645
647
|
throw new Error("key must be a valid hex string");
|
|
646
648
|
}
|
|
@@ -650,7 +652,24 @@ class DataIntegrityTree {
|
|
|
650
652
|
if (!isHexString(expectedRootHash)) {
|
|
651
653
|
throw new Error("expectedRootHash must be a valid hex string");
|
|
652
654
|
}
|
|
653
|
-
|
|
655
|
+
if (!verifiedSha256) {
|
|
656
|
+
// Verify the file's SHA-256 hash
|
|
657
|
+
const isFileValid = await this.verifyFileHash(sha256, dataDir);
|
|
658
|
+
if (!isFileValid) {
|
|
659
|
+
return false;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
// Deserialize and verify the tree
|
|
663
|
+
const tree = this.deserializeAndVerifyTree(serializedTree, expectedRootHash);
|
|
664
|
+
if (!tree) {
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
// Check if the combined hash exists in the foreign tree's leaves
|
|
668
|
+
const isInTree = this.checkHashInTree(tree, hexkey, sha256);
|
|
669
|
+
return isInTree;
|
|
670
|
+
}
|
|
671
|
+
// Function to verify the file's SHA-256 hash
|
|
672
|
+
static async verifyFileHash(sha256, dataDir) {
|
|
654
673
|
const filePath = path.join(dataDir, sha256.match(/.{1,2}/g).join("/"));
|
|
655
674
|
// Check if the file exists
|
|
656
675
|
if (!fs.existsSync(filePath)) {
|
|
@@ -671,29 +690,7 @@ class DataIntegrityTree {
|
|
|
671
690
|
console.warn(`File hash mismatch. Expected: ${sha256}, got: ${uncompressedSha256}`);
|
|
672
691
|
return resolve(false);
|
|
673
692
|
}
|
|
674
|
-
|
|
675
|
-
const leaves = serializedTree.leaves.map((leaf) => Buffer.from(leaf, "hex"));
|
|
676
|
-
const tree = new merkletreejs_1.MerkleTree(leaves, crypto_js_1.SHA256, { sortPairs: true });
|
|
677
|
-
// Verify that the deserialized tree's root matches the expected root hash
|
|
678
|
-
const treeRootHash = tree.getRoot().toString("hex");
|
|
679
|
-
if (treeRootHash !== expectedRootHash) {
|
|
680
|
-
console.warn(`Expected root hash ${expectedRootHash}, but got ${treeRootHash}`);
|
|
681
|
-
return resolve(false);
|
|
682
|
-
}
|
|
683
|
-
// Rebuild the files map from the serialized tree
|
|
684
|
-
// @ts-ignore
|
|
685
|
-
tree.files = new Map(Object.entries(serializedTree.files).map(([key, value]) => [
|
|
686
|
-
key,
|
|
687
|
-
{ hash: value.hash, sha256: value.sha256 },
|
|
688
|
-
]));
|
|
689
|
-
// Check if the SHA-256 exists in the foreign tree's files
|
|
690
|
-
const combinedHash = crypto
|
|
691
|
-
.createHash("sha256")
|
|
692
|
-
.update(`${hexkey}/${sha256}`)
|
|
693
|
-
.digest("hex");
|
|
694
|
-
const leaf = Buffer.from(combinedHash, "hex");
|
|
695
|
-
const isInTree = tree.getLeafIndex(leaf) !== -1;
|
|
696
|
-
resolve(isInTree);
|
|
693
|
+
resolve(true);
|
|
697
694
|
});
|
|
698
695
|
decompressStream.on("error", (err) => {
|
|
699
696
|
reject(err);
|
|
@@ -703,5 +700,34 @@ class DataIntegrityTree {
|
|
|
703
700
|
});
|
|
704
701
|
});
|
|
705
702
|
}
|
|
703
|
+
// Function to deserialize and verify the tree
|
|
704
|
+
static deserializeAndVerifyTree(serializedTree, expectedRootHash) {
|
|
705
|
+
// Deserialize the foreign tree
|
|
706
|
+
const leaves = serializedTree.leaves.map((leaf) => Buffer.from(leaf, "hex"));
|
|
707
|
+
const tree = new merkletreejs_1.MerkleTree(leaves, crypto_js_1.SHA256, { sortPairs: true });
|
|
708
|
+
// Verify that the deserialized tree's root matches the expected root hash
|
|
709
|
+
const treeRootHash = tree.getRoot().toString("hex");
|
|
710
|
+
if (treeRootHash !== expectedRootHash) {
|
|
711
|
+
console.warn(`Expected root hash ${expectedRootHash}, but got ${treeRootHash}`);
|
|
712
|
+
return null;
|
|
713
|
+
}
|
|
714
|
+
// Rebuild the files map from the serialized tree
|
|
715
|
+
// @ts-ignore
|
|
716
|
+
tree.files = new Map(Object.entries(serializedTree.files).map(([key, value]) => [
|
|
717
|
+
key,
|
|
718
|
+
{ hash: value.hash, sha256: value.sha256 },
|
|
719
|
+
]));
|
|
720
|
+
return tree;
|
|
721
|
+
}
|
|
722
|
+
// Function to check if the combined hash exists in the tree
|
|
723
|
+
static checkHashInTree(tree, hexkey, sha256) {
|
|
724
|
+
const combinedHash = crypto
|
|
725
|
+
.createHash("sha256")
|
|
726
|
+
.update(`${hexkey}/${sha256}`)
|
|
727
|
+
.digest("hex");
|
|
728
|
+
const leaf = Buffer.from(combinedHash, "hex");
|
|
729
|
+
const isInTree = tree.getLeafIndex(leaf) !== -1;
|
|
730
|
+
return isInTree;
|
|
731
|
+
}
|
|
706
732
|
}
|
|
707
733
|
exports.DataIntegrityTree = DataIntegrityTree;
|
|
@@ -47,7 +47,7 @@ export declare class PropagationServer {
|
|
|
47
47
|
* Upload a file to the server by sending a PUT request.
|
|
48
48
|
* Logs progress using a local cli-progress bar.
|
|
49
49
|
*/
|
|
50
|
-
uploadFile(label: string, dataPath: string): Promise<void>;
|
|
50
|
+
uploadFile(label: string, dataPath: string, uncompress?: boolean): Promise<void>;
|
|
51
51
|
/**
|
|
52
52
|
* Commit the upload session by sending a POST request to the server.
|
|
53
53
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropagationServer.d.ts","sourceRoot":"","sources":["../../src/DigNetwork/PropagationServer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PropagationServer.d.ts","sourceRoot":"","sources":["../../src/DigNetwork/PropagationServer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAkBrC,qBAAa,iBAAiB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAQ;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;gBAErC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAY9C;;OAEG;IACG,gBAAgB;IAOtB;;OAEG;IACH,gBAAgB;IAQhB;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IAyB3D;;OAEG;IACG,gBAAgB,CACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;IA4C7D;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM;IAyDzC;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IA2BlD;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe;IAqH7E;;OAEG;IACG,mBAAmB;IAkCzB;;OAEG;WACU,WAAW,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM;IA0DnB;;;OAGG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkFlD;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B7C;;;OAGG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM;IA0GjB;;OAEG;WACU,aAAa,CACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM;CA2FpB"}
|
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
@@ -13,7 +36,8 @@ const https_1 = __importDefault(require("https"));
|
|
|
13
36
|
const os_1 = __importDefault(require("os"));
|
|
14
37
|
const path_1 = __importDefault(require("path"));
|
|
15
38
|
const progress_stream_1 = __importDefault(require("progress-stream"));
|
|
16
|
-
const
|
|
39
|
+
const zlib = __importStar(require("zlib"));
|
|
40
|
+
const promiseUtils_1 = require("../utils/promiseUtils");
|
|
17
41
|
const nanospinner_1 = require("nanospinner");
|
|
18
42
|
const hashUtils_1 = require("../utils/hashUtils");
|
|
19
43
|
const ssl_1 = require("../utils/ssl");
|
|
@@ -183,7 +207,7 @@ class PropagationServer {
|
|
|
183
207
|
* Upload a file to the server by sending a PUT request.
|
|
184
208
|
* Logs progress using a local cli-progress bar.
|
|
185
209
|
*/
|
|
186
|
-
async uploadFile(label, dataPath) {
|
|
210
|
+
async uploadFile(label, dataPath, uncompress = false) {
|
|
187
211
|
const filePath = path_1.default.join(config_1.STORE_PATH, this.storeId, dataPath);
|
|
188
212
|
const { nonce, fileExists } = await this.getFileNonce(dataPath);
|
|
189
213
|
if (fileExists) {
|
|
@@ -223,8 +247,20 @@ class PropagationServer {
|
|
|
223
247
|
});
|
|
224
248
|
// Add inactivity timeout to the progress stream
|
|
225
249
|
const passThroughStream = this.addInactivityTimeout(new stream_1.PassThrough(), PropagationServer.inactivityTimeout);
|
|
226
|
-
//
|
|
227
|
-
|
|
250
|
+
// Decide whether to uncompress the file during upload
|
|
251
|
+
if (uncompress) {
|
|
252
|
+
// Create a gunzip (uncompression) stream
|
|
253
|
+
const gunzip = zlib.createGunzip();
|
|
254
|
+
// Pipe the streams: fileReadStream -> gunzip -> progressStream -> passThroughStream
|
|
255
|
+
fileReadStream
|
|
256
|
+
.pipe(gunzip)
|
|
257
|
+
.pipe(progressStream)
|
|
258
|
+
.pipe(passThroughStream);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// Pipe the streams: fileReadStream -> progressStream -> passThroughStream
|
|
262
|
+
fileReadStream.pipe(progressStream).pipe(passThroughStream);
|
|
263
|
+
}
|
|
228
264
|
// Use form-data to construct the request body
|
|
229
265
|
const formData = new form_data_1.default();
|
|
230
266
|
formData.append("file", passThroughStream);
|
|
@@ -311,7 +347,7 @@ class PropagationServer {
|
|
|
311
347
|
// Start the upload session
|
|
312
348
|
await propagationServer.startUploadSession(rootHash);
|
|
313
349
|
const dataStore = blockchain_1.DataStore.from(storeId);
|
|
314
|
-
const files = await dataStore.getFileSetForRootHash(rootHash);
|
|
350
|
+
const files = await dataStore.getFileSetForRootHash(rootHash, true);
|
|
315
351
|
// Prepare upload tasks
|
|
316
352
|
const uploadTasks = files.map((file) => ({
|
|
317
353
|
label: file.name,
|
|
@@ -319,8 +355,8 @@ class PropagationServer {
|
|
|
319
355
|
}));
|
|
320
356
|
// Limit the number of concurrent uploads
|
|
321
357
|
const concurrencyLimit = 10; // Adjust this number as needed
|
|
322
|
-
await (0,
|
|
323
|
-
await propagationServer.uploadFile(task.label, task.dataPath);
|
|
358
|
+
await (0, promiseUtils_1.asyncPool)(concurrencyLimit, uploadTasks, async (task) => {
|
|
359
|
+
await propagationServer.uploadFile(task.label, task.dataPath, true);
|
|
324
360
|
});
|
|
325
361
|
// Commit the session after all files have been uploaded
|
|
326
362
|
await propagationServer.commitUploadSession();
|
|
@@ -520,7 +556,7 @@ class PropagationServer {
|
|
|
520
556
|
const tempDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), "downloadStore-"));
|
|
521
557
|
try {
|
|
522
558
|
// Download files to the temporary directory
|
|
523
|
-
await (0,
|
|
559
|
+
await (0, promiseUtils_1.asyncPool)(concurrencyLimit, downloadTasks, async (task) => {
|
|
524
560
|
await propagationServer.downloadFile(task.label, task.dataPath, rootHash, tempDir);
|
|
525
561
|
});
|
|
526
562
|
// Save the rootHash.dat file to the temporary directory
|
|
@@ -59,7 +59,7 @@ export declare class DataStore {
|
|
|
59
59
|
* @param {string} rootHash - The root hash to fetch the file set.
|
|
60
60
|
* @returns {Promise<{ fileName: string, file: string }[]>} - An array of unique file objects.
|
|
61
61
|
*/
|
|
62
|
-
getFileSetForRootHash(rootHash: string): Promise<{
|
|
62
|
+
getFileSetForRootHash(rootHash: string, skipIntegirtyCheck?: boolean): Promise<{
|
|
63
63
|
name: string;
|
|
64
64
|
path: string;
|
|
65
65
|
}[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataStore.d.ts","sourceRoot":"","sources":["../../src/blockchain/DataStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,SAAS,IAAI,eAAe,EAE5B,iBAAiB,EAIlB,MAAM,8BAA8B,CAAC;AAWtC,OAAO,EAAE,eAAe,EAAW,MAAM,UAAU,CAAC;AAGpD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"DataStore.d.ts","sourceRoot":"","sources":["../../src/blockchain/DataStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,SAAS,IAAI,eAAe,EAE5B,iBAAiB,EAIlB,MAAM,8BAA8B,CAAC;AAWtC,OAAO,EAAE,eAAe,EAAW,MAAM,UAAU,CAAC;AAGpD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAcjD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAoB;gBAEpB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,wBAAwB;IAiB/D,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,IAAI,IAAI,iBAAiB,CAEnC;IAEM,QAAQ,IAAI,MAAM;IAIlB,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;WAMN,cAAc,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;WAOtD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;WAK1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS;WAiBtD,MAAM,CACxB,MAAM,GAAE,qBAA0B,GACjC,OAAO,CAAC,SAAS,CAAC;mBAyCA,IAAI;IA4FzB;;;OAGG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAK5C;;;OAGG;WACiB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxD;;;;OAIG;mBACkB,mBAAmB;WAqB1B,YAAY,IAAI,SAAS,EAAE;IAW5B,aAAa,IAAI,OAAO,CAAC;QACpC,WAAW,EAAE,eAAe,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAmEW,wBAAwB,IAAI,OAAO,CAAC;QAC/C,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAiBW,iBAAiB,IAAI,OAAO,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;YA0BY,iBAAiB;IAYlB,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA4C/D,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAexD,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAKzC,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAM5B,uBAAuB,CAClC,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,OAAO,CAAC;IAkBN,cAAc,CACzB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,eAAe,CAAC;IA+C3B;;;;;OAKG;IACU,qBAAqB,CAChC,QAAQ,EAAE,MAAM,EAChB,kBAAkB,GAAE,OAAe,GAClC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CA6C7C"}
|
|
@@ -20,6 +20,7 @@ const FileCache_1 = require("../utils/FileCache");
|
|
|
20
20
|
const DataStoreSerializer_1 = require("./DataStoreSerializer");
|
|
21
21
|
const node_cache_1 = __importDefault(require("node-cache"));
|
|
22
22
|
const config_2 = require("../utils/config");
|
|
23
|
+
const StoreInfoCacheUpdater_1 = require("./StoreInfoCacheUpdater");
|
|
23
24
|
// Initialize the cache with a TTL of 180 seconds (3 minutes)
|
|
24
25
|
const rootHistoryCache = new node_cache_1.default({ stdTTL: 180 });
|
|
25
26
|
const stat = (0, util_1.promisify)(fs_1.default.stat);
|
|
@@ -202,47 +203,26 @@ class DataStore {
|
|
|
202
203
|
}
|
|
203
204
|
async fetchCoinInfo() {
|
|
204
205
|
try {
|
|
206
|
+
// Kick off the updater instance in the backgounf if not already running
|
|
207
|
+
StoreInfoCacheUpdater_1.StoreInfoCacheUpdater.initInstance();
|
|
205
208
|
// Initialize the cache for the current storeId's coin info
|
|
206
209
|
const storeCoinCache = new FileCache_1.FileCache(`stores`);
|
|
207
210
|
// Try to get cached store info
|
|
208
211
|
const cachedInfo = storeCoinCache.get(this.storeId);
|
|
209
212
|
if (cachedInfo) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
const latestHash = await peer.getHeaderHash(latestHeight);
|
|
222
|
-
// Serialize the store data for caching
|
|
223
|
-
const serializedLatestStore = new DataStoreSerializer_1.DataStoreSerializer(latestStore, latestHeight, latestHash).serialize();
|
|
224
|
-
// Cache updated store info
|
|
225
|
-
storeCoinCache.set(this.storeId, {
|
|
226
|
-
latestStore: serializedLatestStore,
|
|
227
|
-
latestHeight,
|
|
228
|
-
latestHash: latestHash.toString("hex"),
|
|
229
|
-
});
|
|
230
|
-
return { latestStore, latestHeight, latestHash };
|
|
231
|
-
}
|
|
232
|
-
catch {
|
|
233
|
-
// Return cached info if sync fails
|
|
234
|
-
const { latestStore, latestHeight, latestHash } = DataStoreSerializer_1.DataStoreSerializer.deserialize({
|
|
235
|
-
latestStore: cachedInfo.latestStore,
|
|
236
|
-
latestHeight: cachedInfo.latestHeight.toString(),
|
|
237
|
-
latestHash: cachedInfo.latestHash,
|
|
238
|
-
});
|
|
239
|
-
return {
|
|
240
|
-
latestStore,
|
|
241
|
-
latestHeight,
|
|
242
|
-
latestHash: latestHash,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
213
|
+
// If we have cached info, return it directly
|
|
214
|
+
const { latestStore, latestHeight } = DataStoreSerializer_1.DataStoreSerializer.deserialize({
|
|
215
|
+
latestStore: cachedInfo.latestStore,
|
|
216
|
+
latestHeight: cachedInfo.latestHeight.toString(),
|
|
217
|
+
latestHash: cachedInfo.latestHash,
|
|
218
|
+
});
|
|
219
|
+
return {
|
|
220
|
+
latestStore,
|
|
221
|
+
latestHeight: cachedInfo.latestHeight,
|
|
222
|
+
latestHash: Buffer.from(cachedInfo.latestHash, "hex"),
|
|
223
|
+
};
|
|
245
224
|
}
|
|
225
|
+
// If no cached info, proceed to fetch and cache it
|
|
246
226
|
// Use getCreationHeight to retrieve height and hash information
|
|
247
227
|
const { createdAtHeight, createdAtHash } = await this.getCreationHeight();
|
|
248
228
|
// Sync store from peer
|
|
@@ -384,7 +364,7 @@ class DataStore {
|
|
|
384
364
|
* @param {string} rootHash - The root hash to fetch the file set.
|
|
385
365
|
* @returns {Promise<{ fileName: string, file: string }[]>} - An array of unique file objects.
|
|
386
366
|
*/
|
|
387
|
-
async getFileSetForRootHash(rootHash) {
|
|
367
|
+
async getFileSetForRootHash(rootHash, skipIntegirtyCheck = false) {
|
|
388
368
|
const datFilePath = path_1.default.join(config_1.STORE_PATH, this.storeId, `${rootHash}.dat`);
|
|
389
369
|
const datFileContent = JSON.parse(fs_1.default.readFileSync(datFilePath, "utf-8"));
|
|
390
370
|
// Use a Set to ensure uniqueness
|
|
@@ -393,8 +373,12 @@ class DataStore {
|
|
|
393
373
|
for (const [fileKey, fileData] of Object.entries(datFileContent.files)) {
|
|
394
374
|
const filePath = (0, hashUtils_1.getFilePathFromSha256)(datFileContent.files[fileKey].sha256, "data");
|
|
395
375
|
// Perform the integrity check
|
|
396
|
-
|
|
397
|
-
if (
|
|
376
|
+
let integrityCheck;
|
|
377
|
+
if (!skipIntegirtyCheck) {
|
|
378
|
+
integrityCheck =
|
|
379
|
+
await DataIntegrityTree_1.DataIntegrityTree.validateKeyIntegrityWithForeignTree(fileKey, datFileContent.files[fileKey].sha256, datFileContent, rootHash, path_1.default.join(config_1.STORE_PATH, this.storeId, "data"));
|
|
380
|
+
}
|
|
381
|
+
if (integrityCheck || skipIntegirtyCheck) {
|
|
398
382
|
// Add the file to the Set
|
|
399
383
|
filesInvolved.add({
|
|
400
384
|
name: Buffer.from(fileKey, "hex").toString("utf-8"),
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class StoreInfoCacheUpdater {
|
|
2
|
+
private static instance;
|
|
3
|
+
private storeCoinCache;
|
|
4
|
+
private updateInterval;
|
|
5
|
+
private constructor();
|
|
6
|
+
static initInstance(): StoreInfoCacheUpdater;
|
|
7
|
+
private startCacheUpdater;
|
|
8
|
+
private updateCache;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=StoreInfoCacheUpdater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreInfoCacheUpdater.d.ts","sourceRoot":"","sources":["../../src/blockchain/StoreInfoCacheUpdater.ts"],"names":[],"mappings":"AAMA,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAC/C,OAAO,CAAC,cAAc,CAInB;IACH,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO;WAMO,YAAY,IAAI,qBAAqB;IAOnD,OAAO,CAAC,iBAAiB;YAIX,WAAW;CAsE1B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StoreInfoCacheUpdater = void 0;
|
|
4
|
+
const timers_1 = require("timers");
|
|
5
|
+
const FullNodePeer_1 = require("./FullNodePeer");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const DataStoreSerializer_1 = require("./DataStoreSerializer");
|
|
8
|
+
const utils_2 = require("../utils");
|
|
9
|
+
class StoreInfoCacheUpdater {
|
|
10
|
+
constructor(updateIntervalInMinutes = 5) {
|
|
11
|
+
this.storeCoinCache = new utils_1.FileCache(`stores`);
|
|
12
|
+
this.updateInterval = updateIntervalInMinutes * 60 * 1000; // Convert minutes to milliseconds
|
|
13
|
+
this.startCacheUpdater();
|
|
14
|
+
}
|
|
15
|
+
static initInstance() {
|
|
16
|
+
if (!StoreInfoCacheUpdater.instance) {
|
|
17
|
+
StoreInfoCacheUpdater.instance = new StoreInfoCacheUpdater();
|
|
18
|
+
}
|
|
19
|
+
return StoreInfoCacheUpdater.instance;
|
|
20
|
+
}
|
|
21
|
+
startCacheUpdater() {
|
|
22
|
+
(0, timers_1.setInterval)(() => this.updateCache(), this.updateInterval);
|
|
23
|
+
}
|
|
24
|
+
async updateCache() {
|
|
25
|
+
try {
|
|
26
|
+
const storeIds = this.storeCoinCache.getCachedKeys();
|
|
27
|
+
for (const storeId of storeIds) {
|
|
28
|
+
try {
|
|
29
|
+
const cachedInfo = this.storeCoinCache.get(storeId);
|
|
30
|
+
if (!cachedInfo) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Deserialize the cached store info
|
|
34
|
+
const { latestStore: serializedStore, latestHeight, latestHash } = cachedInfo;
|
|
35
|
+
const { latestStore: previousInfo } = DataStoreSerializer_1.DataStoreSerializer.deserialize({
|
|
36
|
+
latestStore: serializedStore,
|
|
37
|
+
latestHeight: latestHeight.toString(),
|
|
38
|
+
latestHash: latestHash,
|
|
39
|
+
});
|
|
40
|
+
// Wrap the connection with a timeout
|
|
41
|
+
const peer = await (0, utils_2.withTimeout)(FullNodePeer_1.FullNodePeer.connect(), 60000, "Timeout connecting to FullNodePeer");
|
|
42
|
+
// Wrap the syncStore call with a timeout
|
|
43
|
+
const { latestStore, latestHeight: newHeight } = await (0, utils_2.withTimeout)(peer.syncStore(previousInfo, latestHeight, Buffer.from(latestHash, "hex"), false), 60000, `Timeout syncing store for storeId ${storeId}`);
|
|
44
|
+
// Wrap the getHeaderHash call with a timeout
|
|
45
|
+
const latestHashBuffer = await (0, utils_2.withTimeout)(peer.getHeaderHash(newHeight), 60000, `Timeout getting header hash for height ${newHeight}`);
|
|
46
|
+
// Serialize the updated store data for caching
|
|
47
|
+
const serializedLatestStore = new DataStoreSerializer_1.DataStoreSerializer(latestStore, newHeight, latestHashBuffer).serialize();
|
|
48
|
+
// Recache the updated store info
|
|
49
|
+
this.storeCoinCache.set(storeId, {
|
|
50
|
+
latestStore: serializedLatestStore,
|
|
51
|
+
latestHeight: newHeight,
|
|
52
|
+
latestHash: latestHashBuffer.toString("hex"),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(`Failed to update cache for storeId ${storeId}:`, error);
|
|
57
|
+
// Optionally handle specific errors or continue with the next storeId
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error("Failed to update store cache:", error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.StoreInfoCacheUpdater = StoreInfoCacheUpdater;
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC;AACtB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC;AACtB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -27,4 +27,4 @@ __exportStar(require("./spinnerUtils"), exports);
|
|
|
27
27
|
__exportStar(require("./ssl"), exports);
|
|
28
28
|
__exportStar(require("./validationUtils"), exports);
|
|
29
29
|
__exportStar(require("./Environment"), exports);
|
|
30
|
-
__exportStar(require("./
|
|
30
|
+
__exportStar(require("./promiseUtils"), exports);
|
|
@@ -6,4 +6,12 @@
|
|
|
6
6
|
* @returns {Promise<Array<R>>} - A promise that resolves when all items have been processed.
|
|
7
7
|
*/
|
|
8
8
|
export declare function asyncPool<T, R>(limit: number, items: T[], iteratorFn: (item: T) => Promise<R>): Promise<R[]>;
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Helper function to add a timeout to a promise.
|
|
11
|
+
* @param promise The original promise.
|
|
12
|
+
* @param ms Timeout in milliseconds.
|
|
13
|
+
* @param timeoutMessage The error message when the timeout is reached.
|
|
14
|
+
* @returns Promise that resolves before the timeout or rejects with an error.
|
|
15
|
+
*/
|
|
16
|
+
export declare const withTimeout: <T>(promise: Promise<T>, ms: number, timeoutMessage: string) => Promise<T>;
|
|
17
|
+
//# sourceMappingURL=promiseUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promiseUtils.d.ts","sourceRoot":"","sources":["../../src/utils/promiseUtils.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAgBd;AAED;;;;;;EAMC;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,WAClB,OAAO,CAAC,CAAC,CAAC,MACf,MAAM,kBACM,MAAM,KACrB,OAAO,CAAC,CAAC,CAOX,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withTimeout = void 0;
|
|
3
4
|
exports.asyncPool = asyncPool;
|
|
4
5
|
/**
|
|
5
6
|
* Processes items in sequential batches with a concurrency limit.
|
|
@@ -21,3 +22,17 @@ async function asyncPool(limit, items, iteratorFn) {
|
|
|
21
22
|
}
|
|
22
23
|
return ret;
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Helper function to add a timeout to a promise.
|
|
27
|
+
* @param promise The original promise.
|
|
28
|
+
* @param ms Timeout in milliseconds.
|
|
29
|
+
* @param timeoutMessage The error message when the timeout is reached.
|
|
30
|
+
* @returns Promise that resolves before the timeout or rejects with an error.
|
|
31
|
+
*/
|
|
32
|
+
const withTimeout = (promise, ms, timeoutMessage) => {
|
|
33
|
+
return Promise.race([
|
|
34
|
+
promise,
|
|
35
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(timeoutMessage)), ms)),
|
|
36
|
+
]);
|
|
37
|
+
};
|
|
38
|
+
exports.withTimeout = withTimeout;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asyncPool.d.ts","sourceRoot":"","sources":["../../src/utils/asyncPool.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAgBd"}
|