@bsv/wallet-toolbox 2.8.0 → 2.9.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/CHANGELOG.md +14 -3
- package/README.md +9 -1
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts +22 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts +70 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js +21 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +33 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +6 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +9 -3
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js +45 -5
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +2 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.js +2 -0
- package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.js +2 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts +15 -2
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js +115 -13
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +17 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +174 -87
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts +32 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js +30 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +2 -2
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +5 -3
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts +39 -0
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js +194 -0
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts +1 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js +1 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts +12 -0
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js +52 -0
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts +40 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js +207 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChaintracksFetch.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"ChaintracksFetch.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAS5F,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CACtB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,eAAe,CAAC,EAAE,MAAM;IAL1C,YACE,OAAO,EAAE,MAAM,EACC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,YAAA,EAIzC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF;AAmCD;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,UAAU,EAAE,UAAU,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,YAAY,OAAO,GAAE,uBAA4B,EAehD;IAEK,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBhH;IAEK,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAW1C;YAEa,YAAY;YAiCZ,cAAc;YAed,iBAAiB;IAwC/B,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,cAAc;IAOtB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIjD;CACF"}
|
|
@@ -79,14 +79,14 @@ class ChaintracksFetch {
|
|
|
79
79
|
this.maxRetryMsecs = positiveSafeInteger(options.maxRetryMsecs, DEFAULT_MAX_RETRY_MSECS, 'maxRetryMsecs');
|
|
80
80
|
this.random = options.random ?? Math.random;
|
|
81
81
|
}
|
|
82
|
-
async download(url, maxResponseBytes) {
|
|
82
|
+
async download(url, maxResponseBytes, options) {
|
|
83
83
|
const responseLimit = maxResponseBytes == null
|
|
84
84
|
? this.maxResponseBytes
|
|
85
85
|
: Math.min(this.maxResponseBytes, positiveSafeInteger(maxResponseBytes, this.maxResponseBytes, 'maxResponseBytes'));
|
|
86
86
|
return await this.requestBytes(url, {
|
|
87
87
|
method: 'GET',
|
|
88
88
|
headers: { Accept: 'application/octet-stream' }
|
|
89
|
-
}, 'download', responseLimit);
|
|
89
|
+
}, 'download', responseLimit, options);
|
|
90
90
|
}
|
|
91
91
|
async fetchJson(url) {
|
|
92
92
|
const bytes = await this.requestBytes(url, {
|
|
@@ -95,8 +95,10 @@ class ChaintracksFetch {
|
|
|
95
95
|
}, 'fetch JSON', this.maxResponseBytes);
|
|
96
96
|
return JSON.parse(new TextDecoder().decode(bytes));
|
|
97
97
|
}
|
|
98
|
-
async requestBytes(url, init, kind, maxResponseBytes) {
|
|
98
|
+
async requestBytes(url, init, kind, maxResponseBytes, downloadOptions) {
|
|
99
99
|
for (let retry = 0;; retry++) {
|
|
100
|
+
if (retry > 0)
|
|
101
|
+
await downloadOptions?.beforeRetry?.(retry + 1);
|
|
100
102
|
const controller = new AbortController();
|
|
101
103
|
const timeout = setTimeout(() => controller.abort(), this.timeoutMsecs);
|
|
102
104
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChaintracksFetch.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ChaintracksFetch.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { BulkFileDownloadBudgetApi, BulkFileDownloadBudgetSnapshot } from '../Api/BulkFileDataCacheApi';
|
|
2
|
+
export interface DurableFileBulkFileDownloadBudgetOptions {
|
|
3
|
+
maxBytes: number;
|
|
4
|
+
stateFile: string;
|
|
5
|
+
windowMsecs?: number;
|
|
6
|
+
now?: () => number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Crash-safe fixed-window reservation ledger for remote bulk-header bytes.
|
|
10
|
+
*
|
|
11
|
+
* State is flushed before `consume` resolves, so a crash may conservatively
|
|
12
|
+
* over-count an attempt but can never reset the allowance or permit an
|
|
13
|
+
* unrecorded request. Deployments must place `stateFile` on durable storage.
|
|
14
|
+
*
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export declare class DurableFileBulkFileDownloadBudget implements BulkFileDownloadBudgetApi {
|
|
18
|
+
private readonly maxBytes;
|
|
19
|
+
private readonly windowMsecs;
|
|
20
|
+
private readonly stateFile;
|
|
21
|
+
private readonly now;
|
|
22
|
+
private tail;
|
|
23
|
+
private snapshotState;
|
|
24
|
+
constructor(options: DurableFileBulkFileDownloadBudgetOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Load and validate the durable ledger before the service becomes ready.
|
|
27
|
+
*
|
|
28
|
+
* `consume` also initializes lazily, but services should await this method so
|
|
29
|
+
* readiness reports the persisted allowance and corrupt state fails startup.
|
|
30
|
+
*/
|
|
31
|
+
initialize(): Promise<void>;
|
|
32
|
+
consume(byteCount: number): Promise<void>;
|
|
33
|
+
snapshot(): BulkFileDownloadBudgetSnapshot;
|
|
34
|
+
private consumeSerialized;
|
|
35
|
+
private newState;
|
|
36
|
+
private readState;
|
|
37
|
+
private writeState;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=DurableFileBulkFileDownloadBudget.d.ts.map
|
package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DurableFileBulkFileDownloadBudget.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA;AAE5G,MAAM,WAAW,wCAAwC;IACvD,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAUD;;;;;;;;GAQG;AACH,qBAAa,iCAAkC,YAAW,yBAAyB;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,aAAa,CAAa;IAElC,YAAY,OAAO,EAAE,wCAAwC,EAO5D;IAED;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAShC;IAEK,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9C;IAED,QAAQ,IAAI,8BAA8B,CAQzC;YAEa,iBAAiB;IAe/B,OAAO,CAAC,QAAQ;YAUF,SAAS;YAsBT,UAAU;CAoBzB"}
|
|
@@ -0,0 +1,194 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DurableFileBulkFileDownloadBudget = void 0;
|
|
37
|
+
const node_crypto_1 = require("node:crypto");
|
|
38
|
+
const node_fs_1 = require("node:fs");
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
const sdk_1 = require("../../../../sdk");
|
|
41
|
+
/**
|
|
42
|
+
* Crash-safe fixed-window reservation ledger for remote bulk-header bytes.
|
|
43
|
+
*
|
|
44
|
+
* State is flushed before `consume` resolves, so a crash may conservatively
|
|
45
|
+
* over-count an attempt but can never reset the allowance or permit an
|
|
46
|
+
* unrecorded request. Deployments must place `stateFile` on durable storage.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
50
|
+
class DurableFileBulkFileDownloadBudget {
|
|
51
|
+
maxBytes;
|
|
52
|
+
windowMsecs;
|
|
53
|
+
stateFile;
|
|
54
|
+
now;
|
|
55
|
+
tail = Promise.resolve();
|
|
56
|
+
snapshotState;
|
|
57
|
+
constructor(options) {
|
|
58
|
+
this.maxBytes = positiveInteger(options.maxBytes, 'maxBytes');
|
|
59
|
+
this.windowMsecs = positiveInteger(options.windowMsecs ?? 60 * 60 * 1000, 'windowMsecs');
|
|
60
|
+
if (options.stateFile.trim() === '')
|
|
61
|
+
throw new sdk_1.WERR_INVALID_PARAMETER('stateFile', 'a non-empty path');
|
|
62
|
+
this.stateFile = path.resolve(options.stateFile);
|
|
63
|
+
this.now = options.now ?? Date.now;
|
|
64
|
+
this.snapshotState = this.newState(this.now());
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Load and validate the durable ledger before the service becomes ready.
|
|
68
|
+
*
|
|
69
|
+
* `consume` also initializes lazily, but services should await this method so
|
|
70
|
+
* readiness reports the persisted allowance and corrupt state fails startup.
|
|
71
|
+
*/
|
|
72
|
+
async initialize() {
|
|
73
|
+
const operation = this.tail.then(async () => {
|
|
74
|
+
await this.readState();
|
|
75
|
+
});
|
|
76
|
+
this.tail = operation.then(() => undefined, () => undefined);
|
|
77
|
+
await operation;
|
|
78
|
+
}
|
|
79
|
+
async consume(byteCount) {
|
|
80
|
+
positiveInteger(byteCount, 'byteCount');
|
|
81
|
+
const operation = this.tail.then(async () => await this.consumeSerialized(byteCount));
|
|
82
|
+
this.tail = operation.then(() => undefined, () => undefined);
|
|
83
|
+
return await operation;
|
|
84
|
+
}
|
|
85
|
+
snapshot() {
|
|
86
|
+
return {
|
|
87
|
+
maxBytes: this.snapshotState.maxBytes,
|
|
88
|
+
consumedBytes: this.snapshotState.consumedBytes,
|
|
89
|
+
remainingBytes: this.snapshotState.maxBytes - this.snapshotState.consumedBytes,
|
|
90
|
+
windowStartedAt: this.snapshotState.windowStartedAt,
|
|
91
|
+
windowMsecs: this.snapshotState.windowMsecs
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async consumeSerialized(byteCount) {
|
|
95
|
+
const now = this.now();
|
|
96
|
+
let state = await this.readState();
|
|
97
|
+
if (now - state.windowStartedAt >= this.windowMsecs)
|
|
98
|
+
state = this.newState(now);
|
|
99
|
+
if (state.consumedBytes + byteCount > this.maxBytes) {
|
|
100
|
+
throw new Error(`Bulk-header download budget exceeded: requested ${byteCount} bytes with ` +
|
|
101
|
+
`${this.maxBytes - state.consumedBytes} bytes remaining in the current window.`);
|
|
102
|
+
}
|
|
103
|
+
state.consumedBytes += byteCount;
|
|
104
|
+
await this.writeState(state);
|
|
105
|
+
this.snapshotState = state;
|
|
106
|
+
}
|
|
107
|
+
newState(windowStartedAt) {
|
|
108
|
+
return {
|
|
109
|
+
version: 1,
|
|
110
|
+
maxBytes: this.maxBytes,
|
|
111
|
+
windowMsecs: this.windowMsecs,
|
|
112
|
+
windowStartedAt,
|
|
113
|
+
consumedBytes: 0
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async readState() {
|
|
117
|
+
let parsed;
|
|
118
|
+
try {
|
|
119
|
+
parsed = JSON.parse(await node_fs_1.promises.readFile(this.stateFile, 'utf8'));
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error.code === 'ENOENT')
|
|
123
|
+
return this.newState(this.now());
|
|
124
|
+
throw new Error(`Unable to read durable bulk-header download budget: ${String(error)}`);
|
|
125
|
+
}
|
|
126
|
+
if (!isBudgetState(parsed))
|
|
127
|
+
throw new Error('Durable bulk-header download budget state is invalid.');
|
|
128
|
+
// Configuration changes never reset an active allowance. A lower maximum
|
|
129
|
+
// clamps consumption to "fully spent" and a shorter window takes effect
|
|
130
|
+
// only after the longer active window has elapsed.
|
|
131
|
+
const migrated = {
|
|
132
|
+
...parsed,
|
|
133
|
+
maxBytes: this.maxBytes,
|
|
134
|
+
windowMsecs: Math.max(parsed.windowMsecs, this.windowMsecs),
|
|
135
|
+
consumedBytes: Math.min(parsed.consumedBytes, this.maxBytes)
|
|
136
|
+
};
|
|
137
|
+
this.snapshotState = migrated;
|
|
138
|
+
return migrated;
|
|
139
|
+
}
|
|
140
|
+
async writeState(state) {
|
|
141
|
+
const folder = path.dirname(this.stateFile);
|
|
142
|
+
await node_fs_1.promises.mkdir(folder, { recursive: true });
|
|
143
|
+
const temporary = path.join(folder, `.${path.basename(this.stateFile)}.${process.pid}.${(0, node_crypto_1.randomUUID)()}.tmp`);
|
|
144
|
+
let handle;
|
|
145
|
+
try {
|
|
146
|
+
handle = await node_fs_1.promises.open(temporary, 'wx', 0o600);
|
|
147
|
+
await handle.writeFile(JSON.stringify(state));
|
|
148
|
+
await handle.sync();
|
|
149
|
+
await handle.close();
|
|
150
|
+
handle = undefined;
|
|
151
|
+
await node_fs_1.promises.rename(temporary, this.stateFile);
|
|
152
|
+
await syncDirectory(folder);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
await handle?.close().catch(() => undefined);
|
|
156
|
+
await node_fs_1.promises.unlink(temporary).catch(error => {
|
|
157
|
+
if (error.code !== 'ENOENT')
|
|
158
|
+
throw error;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.DurableFileBulkFileDownloadBudget = DurableFileBulkFileDownloadBudget;
|
|
164
|
+
function positiveInteger(value, name) {
|
|
165
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
166
|
+
throw new sdk_1.WERR_INVALID_PARAMETER(name, 'a positive safe integer');
|
|
167
|
+
}
|
|
168
|
+
return value;
|
|
169
|
+
}
|
|
170
|
+
function isBudgetState(value) {
|
|
171
|
+
if (value == null || typeof value !== 'object')
|
|
172
|
+
return false;
|
|
173
|
+
const state = value;
|
|
174
|
+
return (state.version === 1 &&
|
|
175
|
+
Number.isSafeInteger(state.maxBytes) &&
|
|
176
|
+
Number.isSafeInteger(state.windowMsecs) &&
|
|
177
|
+
Number.isSafeInteger(state.windowStartedAt) &&
|
|
178
|
+
Number.isSafeInteger(state.consumedBytes) &&
|
|
179
|
+
state.maxBytes > 0 &&
|
|
180
|
+
state.windowMsecs > 0 &&
|
|
181
|
+
state.windowStartedAt >= 0 &&
|
|
182
|
+
state.consumedBytes >= 0 &&
|
|
183
|
+
state.consumedBytes <= state.maxBytes);
|
|
184
|
+
}
|
|
185
|
+
async function syncDirectory(folder) {
|
|
186
|
+
const handle = await node_fs_1.promises.open(folder, 'r');
|
|
187
|
+
try {
|
|
188
|
+
await handle.sync();
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
await handle.close();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=DurableFileBulkFileDownloadBudget.js.map
|
package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DurableFileBulkFileDownloadBudget.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.ts"],"names":[],"mappings":"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"}
|
package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixedWindowBulkFileDownloadBudget.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAE5E,MAAM,WAAW,wCAAwC;IACvD,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iCAAkC,YAAW,yBAAyB;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,aAAa,CAAI;IAEzB,YAAY,OAAO,EAAE,wCAAwC,EAY5D;IAED,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAgB/B;IAED,QAAQ,IAAI;
|
|
1
|
+
{"version":3,"file":"FixedWindowBulkFileDownloadBudget.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAE5E,MAAM,WAAW,wCAAwC;IACvD,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iCAAkC,YAAW,yBAAyB;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,aAAa,CAAI;IAEzB,YAAY,OAAO,EAAE,wCAAwC,EAY5D;IAED,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAgB/B;IAED,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAA;QAChB,aAAa,EAAE,MAAM,CAAA;QACrB,cAAc,EAAE,MAAM,CAAA;QACtB,eAAe,EAAE,MAAM,CAAA;QACvB,WAAW,EAAE,MAAM,CAAA;KACpB,CAQA;CACF"}
|
package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixedWindowBulkFileDownloadBudget.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.ts"],"names":[],"mappings":";;;AAAA,yCAAwD;AASxD;;;;;;GAMG;AACH;IACmB,QAAQ,CAAQ;IAChB,WAAW,CAAQ;IACnB,GAAG,CAAc;IAC1B,eAAe,CAAQ;IACvB,aAAa,GAAG,CAAC,CAAA;IAEzB,YAAY,OAAiD;QAC3D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,4BAAsB,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAA;QACzE,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,4BAAsB,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAA;QAC5E,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACnC,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,4BAAsB,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,eAAe,GAAG,GAAG,CAAA;YAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,mDAAmD,SAAS,cAAc;gBACxE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,yCAAyC,CACjF,CAAA;QACH,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,SAAS,CAAA;IACjC,CAAC;IAED,QAAQ;
|
|
1
|
+
{"version":3,"file":"FixedWindowBulkFileDownloadBudget.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.ts"],"names":[],"mappings":";;;AAAA,yCAAwD;AASxD;;;;;;GAMG;AACH;IACmB,QAAQ,CAAQ;IAChB,WAAW,CAAQ;IACnB,GAAG,CAAc;IAC1B,eAAe,CAAQ;IACvB,aAAa,GAAG,CAAC,CAAA;IAEzB,YAAY,OAAiD;QAC3D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,4BAAsB,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAA;QACzE,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,4BAAsB,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAA;QAC5E,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACnC,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,4BAAsB,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,eAAe,GAAG,GAAG,CAAA;YAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,mDAAmD,SAAS,cAAc;gBACxE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,yCAAyC,CACjF,CAAA;QACH,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,SAAS,CAAA;IACjC,CAAC;IAED,QAAQ;QAON,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa;YAClD,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BulkFileDataValidationRequest, BulkFileDataValidationResult, BulkFileDataValidatorApi } from '../Api/BulkFileDataValidatorApi';
|
|
2
|
+
/**
|
|
3
|
+
* Portable complete-object validator. Node services should normally inject
|
|
4
|
+
* `NodeBulkFileDataValidator`; browser and mobile consumers retain this
|
|
5
|
+
* dependency-free fallback.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare class InlineBulkFileDataValidator implements BulkFileDataValidatorApi {
|
|
10
|
+
validate(request: BulkFileDataValidationRequest): Promise<BulkFileDataValidationResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=InlineBulkFileDataValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineBulkFileDataValidator.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,iCAAiC,CAAA;AAIxC;;;;;;GAMG;AACH,qBAAa,2BAA4B,YAAW,wBAAwB;IACpE,QAAQ,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CA6C5F;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InlineBulkFileDataValidator = void 0;
|
|
4
|
+
const sdk_1 = require("@bsv/sdk");
|
|
5
|
+
const sdk_2 = require("../../../../sdk");
|
|
6
|
+
const utilityHelpers_noBuffer_1 = require("../../../../utility/utilityHelpers.noBuffer");
|
|
7
|
+
const BulkFileDataValidatorApi_1 = require("../Api/BulkFileDataValidatorApi");
|
|
8
|
+
const blockHeaderUtilities_1 = require("./blockHeaderUtilities");
|
|
9
|
+
/**
|
|
10
|
+
* Portable complete-object validator. Node services should normally inject
|
|
11
|
+
* `NodeBulkFileDataValidator`; browser and mobile consumers retain this
|
|
12
|
+
* dependency-free fallback.
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
class InlineBulkFileDataValidator {
|
|
17
|
+
async validate(request) {
|
|
18
|
+
try {
|
|
19
|
+
const expectedLength = request.count * 80;
|
|
20
|
+
if (request.data.length !== expectedLength) {
|
|
21
|
+
throw new sdk_2.WERR_INVALID_PARAMETER('file.data', `bulk file ${request.fileName} data length ${request.data.length} does not match expected count ${request.count}`);
|
|
22
|
+
}
|
|
23
|
+
const fileHash = (0, utilityHelpers_noBuffer_1.asString)(sdk_1.Hash.sha256((0, utilityHelpers_noBuffer_1.asArray)(request.data)), 'base64');
|
|
24
|
+
if (request.fileHash != null && fileHash !== request.fileHash) {
|
|
25
|
+
throw new sdk_2.WERR_INVALID_PARAMETER('fileHash', `a match for retrieved data for ${request.fileName}`);
|
|
26
|
+
}
|
|
27
|
+
const { lastHeaderHash, lastChainWork } = (0, blockHeaderUtilities_1.validateBufferOfHeaders)(request.data, request.prevHash, 0, request.count, request.prevChainWork);
|
|
28
|
+
if (request.lastHash && request.lastHash !== lastHeaderHash) {
|
|
29
|
+
throw new sdk_2.WERR_INVALID_PARAMETER('file.lastHash', `expected ${request.lastHash} but got ${lastHeaderHash}`);
|
|
30
|
+
}
|
|
31
|
+
if (request.lastChainWork && request.lastChainWork !== lastChainWork) {
|
|
32
|
+
throw new sdk_2.WERR_INVALID_PARAMETER('file.lastChainWork', `expected ${request.lastChainWork} but got ${lastChainWork}`);
|
|
33
|
+
}
|
|
34
|
+
if (request.firstHeight === 0 && request.chain != null)
|
|
35
|
+
(0, blockHeaderUtilities_1.validateGenesisHeader)(request.data, request.chain);
|
|
36
|
+
return {
|
|
37
|
+
data: request.data,
|
|
38
|
+
fileHash,
|
|
39
|
+
lastHeaderHash,
|
|
40
|
+
lastChainWork: lastChainWork
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof BulkFileDataValidatorApi_1.BulkFileDataValidationError)
|
|
45
|
+
throw error;
|
|
46
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
47
|
+
throw new BulkFileDataValidatorApi_1.BulkFileDataValidationError(message, request.data);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.InlineBulkFileDataValidator = InlineBulkFileDataValidator;
|
|
52
|
+
//# sourceMappingURL=InlineBulkFileDataValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineBulkFileDataValidator.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.ts"],"names":[],"mappings":";;;AAAA,kCAA+B;AAC/B,yCAAwD;AACxD,yFAA+E;AAM/E,8EAA6E;AAC7E,iEAAuF;AAEvF;;;;;;GAMG;AACH;IACE,KAAK,CAAC,QAAQ,CAAC,OAAsC;QACnD,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,GAAG,EAAE,CAAA;YACzC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBAC3C,MAAM,IAAI,4BAAsB,CAC9B,WAAW,EACX,aAAa,OAAO,CAAC,QAAQ,gBAAgB,OAAO,CAAC,IAAI,CAAC,MAAM,kCAAkC,OAAO,CAAC,KAAK,EAAE,CAClH,CAAA;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,IAAA,kCAAQ,EAAC,UAAI,CAAC,MAAM,CAAC,IAAA,iCAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACvE,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC9D,MAAM,IAAI,4BAAsB,CAAC,UAAU,EAAE,kCAAkC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;YACpG,CAAC;YAED,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,IAAA,8CAAuB,EAC/D,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,QAAQ,EAChB,CAAC,EACD,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,aAAa,CACtB,CAAA;YAED,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBAC5D,MAAM,IAAI,4BAAsB,CAAC,eAAe,EAAE,YAAY,OAAO,CAAC,QAAQ,YAAY,cAAc,EAAE,CAAC,CAAA;YAC7G,CAAC;YACD,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;gBACrE,MAAM,IAAI,4BAAsB,CAC9B,oBAAoB,EACpB,YAAY,OAAO,CAAC,aAAa,YAAY,aAAa,EAAE,CAC7D,CAAA;YACH,CAAC;YACD,IAAI,OAAO,CAAC,WAAW,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI;gBAAE,IAAA,4CAAqB,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;YAE1G,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ;gBACR,cAAc;gBACd,aAAa,EAAE,aAAc;aAC9B,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,sDAA2B;gBAAE,MAAM,KAAK,CAAA;YAC7D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,MAAM,IAAI,sDAA2B,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type BulkFileDataValidationRequest, type BulkFileDataValidationResult, type BulkFileDataValidatorApi, type BulkFileDataValidatorStats } from '../Api/BulkFileDataValidatorApi';
|
|
2
|
+
export interface NodeBulkFileDataValidatorOptions {
|
|
3
|
+
/** Number of validation workers. Defaults to one to bound CPU usage. */
|
|
4
|
+
maxWorkers?: number;
|
|
5
|
+
/** Maximum number of waiting validations. Defaults to eight. */
|
|
6
|
+
maxQueue?: number;
|
|
7
|
+
/** Per-object validation deadline. Defaults to two minutes. */
|
|
8
|
+
taskTimeoutMsecs?: number;
|
|
9
|
+
/** Test-only worker entry override. */
|
|
10
|
+
workerPath?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Bounded Node worker pool for complete bulk-header verification.
|
|
14
|
+
*
|
|
15
|
+
* A bounded private copy transfers to the worker and back without structured
|
|
16
|
+
* cloning. This preserves the caller's source bytes if a worker crashes while
|
|
17
|
+
* queue bounds prevent validation copies from consuming unbounded memory.
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare class NodeBulkFileDataValidator implements BulkFileDataValidatorApi {
|
|
22
|
+
private readonly maxQueue;
|
|
23
|
+
private readonly taskTimeoutMsecs;
|
|
24
|
+
private readonly workerPath;
|
|
25
|
+
private readonly workers;
|
|
26
|
+
private readonly queue;
|
|
27
|
+
private nextTaskId;
|
|
28
|
+
private destroyed;
|
|
29
|
+
private readonly stats;
|
|
30
|
+
constructor(options?: NodeBulkFileDataValidatorOptions);
|
|
31
|
+
validate(request: BulkFileDataValidationRequest): Promise<BulkFileDataValidationResult>;
|
|
32
|
+
getStats(): BulkFileDataValidatorStats;
|
|
33
|
+
destroy(): Promise<void>;
|
|
34
|
+
private spawnWorker;
|
|
35
|
+
private dispatch;
|
|
36
|
+
private complete;
|
|
37
|
+
private failWorker;
|
|
38
|
+
private updateQueueStats;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=NodeBulkFileDataValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeBulkFileDataValidator.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,MAAM,iCAAiC,CAAA;AAExC,MAAM,WAAW,gCAAgC;IAC/C,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AA8BD;;;;;;;;GAQG;AACH,qBAAa,yBAA0B,YAAW,wBAAwB;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAWrB;IAED,YAAY,OAAO,GAAE,gCAAqC,EAMzD;IAEK,QAAQ,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAc5F;IAED,QAAQ,IAAI,0BAA0B,CAMrC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAe7B;IAED,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,QAAQ;IAqBhB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,gBAAgB;CAKzB"}
|