@bsv/wallet-toolbox 2.7.1 → 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 +27 -0
- package/README.md +22 -3
- package/docs/README.md +24 -23
- package/docs/local-first-chaintracks.md +129 -0
- package/out/src/index.mobile.d.ts +1 -0
- package/out/src/index.mobile.d.ts.map +1 -1
- package/out/src/index.mobile.js +1 -0
- package/out/src/index.mobile.js.map +1 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts +8 -0
- package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +3 -1
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/chaintracker/LocalChainTracker.d.ts +96 -0
- package/out/src/services/chaintracker/LocalChainTracker.d.ts.map +1 -0
- package/out/src/services/chaintracker/LocalChainTracker.js +295 -0
- package/out/src/services/chaintracker/LocalChainTracker.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts +48 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js +3 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js.map +1 -0
- 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 +46 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +7 -2
- 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 +48 -6
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +5 -4
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +8 -0
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +4 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.js +3 -0
- package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +5 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.js +5 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts +33 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js +204 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +39 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +248 -85
- 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/BulkHeaderFile.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js +2 -2
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +31 -4
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +124 -46
- 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 +30 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js +57 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js.map +1 -0
- 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/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts +11 -3
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +51 -12
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
- package/out/src/services/chaintracker/index.all.d.ts +1 -0
- package/out/src/services/chaintracker/index.all.d.ts.map +1 -1
- package/out/src/services/chaintracker/index.all.js +1 -0
- package/out/src/services/chaintracker/index.all.js.map +1 -1
- package/out/src/services/chaintracker/index.client.d.ts +1 -0
- package/out/src/services/chaintracker/index.client.d.ts.map +1 -1
- package/out/src/services/chaintracker/index.client.js +1 -0
- package/out/src/services/chaintracker/index.client.js.map +1 -1
- package/out/src/services/chaintracker/index.mobile.d.ts +1 -0
- package/out/src/services/chaintracker/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/index.mobile.js +1 -0
- package/out/src/services/chaintracker/index.mobile.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BulkFileDataValidationRequest, BulkFileDataValidationResult, BulkFileDataValidatorApi } from '../Api/BulkFileDataValidatorApi';
|
|
2
|
+
export interface BulkFileDataValidatorWorkerRequest {
|
|
3
|
+
id: number;
|
|
4
|
+
request: Omit<BulkFileDataValidationRequest, 'data'> & {
|
|
5
|
+
data: ArrayBuffer;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
interface WorkerSuccess {
|
|
9
|
+
id: number;
|
|
10
|
+
ok: true;
|
|
11
|
+
result: Omit<BulkFileDataValidationResult, 'data'> & {
|
|
12
|
+
data: ArrayBuffer;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
interface WorkerFailure {
|
|
16
|
+
id: number;
|
|
17
|
+
ok: false;
|
|
18
|
+
error: {
|
|
19
|
+
name: string;
|
|
20
|
+
message: string;
|
|
21
|
+
stack?: string;
|
|
22
|
+
} | string;
|
|
23
|
+
data: ArrayBuffer;
|
|
24
|
+
}
|
|
25
|
+
export interface BulkFileDataValidatorWorkerPort {
|
|
26
|
+
on(event: 'message', listener: (message: BulkFileDataValidatorWorkerRequest) => void | Promise<void>): unknown;
|
|
27
|
+
postMessage(message: WorkerSuccess | WorkerFailure, transferList: ArrayBuffer[]): unknown;
|
|
28
|
+
}
|
|
29
|
+
export declare function createBulkFileDataValidatorWorkerHandler(port: Pick<BulkFileDataValidatorWorkerPort, 'postMessage'>, validator?: BulkFileDataValidatorApi): (message: BulkFileDataValidatorWorkerRequest) => Promise<void>;
|
|
30
|
+
export declare function attachBulkFileDataValidatorWorker(port: BulkFileDataValidatorWorkerPort, validator?: BulkFileDataValidatorApi): void;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=BulkFileDataValidator.worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkFileDataValidator.worker.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,iCAAiC,CAAA;AAGxC,MAAM,WAAW,kCAAkC;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAA;CAC7E;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAA;CAC3E;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAA;IACjE,IAAI,EAAE,WAAW,CAAA;CAClB;AAED,MAAM,WAAW,+BAA+B;IAC9C,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,kCAAkC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;IAC9G,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;CAC1F;AAED,wBAAgB,wCAAwC,CACtD,IAAI,EAAE,IAAI,CAAC,+BAA+B,EAAE,aAAa,CAAC,EAC1D,SAAS,GAAE,wBAA4D,GACtE,CAAC,OAAO,EAAE,kCAAkC,KAAK,OAAO,CAAC,IAAI,CAAC,CAoBhE;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,+BAA+B,EACrC,SAAS,GAAE,wBAA4D,GACtE,IAAI,CAEN"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBulkFileDataValidatorWorkerHandler = createBulkFileDataValidatorWorkerHandler;
|
|
4
|
+
exports.attachBulkFileDataValidatorWorker = attachBulkFileDataValidatorWorker;
|
|
5
|
+
const node_worker_threads_1 = require("node:worker_threads");
|
|
6
|
+
const InlineBulkFileDataValidator_1 = require("./InlineBulkFileDataValidator");
|
|
7
|
+
function createBulkFileDataValidatorWorkerHandler(port, validator = new InlineBulkFileDataValidator_1.InlineBulkFileDataValidator()) {
|
|
8
|
+
return async ({ id, request }) => {
|
|
9
|
+
const data = new Uint8Array(request.data);
|
|
10
|
+
try {
|
|
11
|
+
const result = await validator.validate({ ...request, data });
|
|
12
|
+
const resultBuffer = result.data.buffer;
|
|
13
|
+
port.postMessage({ id, ok: true, result: { ...result, data: resultBuffer } }, [resultBuffer]);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
port.postMessage({
|
|
17
|
+
id,
|
|
18
|
+
ok: false,
|
|
19
|
+
error: error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : String(error),
|
|
20
|
+
data: data.buffer
|
|
21
|
+
}, [data.buffer]);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function attachBulkFileDataValidatorWorker(port, validator = new InlineBulkFileDataValidator_1.InlineBulkFileDataValidator()) {
|
|
26
|
+
port.on('message', createBulkFileDataValidatorWorkerHandler(port, validator));
|
|
27
|
+
}
|
|
28
|
+
if (node_worker_threads_1.parentPort != null)
|
|
29
|
+
attachBulkFileDataValidatorWorker(node_worker_threads_1.parentPort);
|
|
30
|
+
//# sourceMappingURL=BulkFileDataValidator.worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkFileDataValidator.worker.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.ts"],"names":[],"mappings":";;;;AAAA,6DAAgD;AAMhD,+EAA2E;AAyB3E,kDACE,IAA0D,EAC1D,SAAS,GAA6B,IAAI,yDAA2B,EAAE;IAEvE,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAqB,CAAA;YACtD,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CACd;gBACE,EAAE;gBACF,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3G,IAAI,EAAE,IAAI,CAAC,MAAqB;aACjC,EACD,CAAC,IAAI,CAAC,MAAqB,CAAC,CAC7B,CAAA;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,2CACE,IAAqC,EACrC,SAAS,GAA6B,IAAI,yDAA2B,EAAE;IAEvE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,wCAAwC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED,IAAI,gCAAU,IAAI,IAAI;IAAE,iCAAiC,CAAC,gCAAU,CAAC,CAAA"}
|
|
@@ -45,7 +45,8 @@ export interface BulkHeaderFileInfo {
|
|
|
45
45
|
chain?: Chain;
|
|
46
46
|
data?: Uint8Array;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* Advisory process-local validation state. Never trust this value after it
|
|
49
|
+
* crosses a network or storage boundary; revalidate the object bytes.
|
|
49
50
|
*/
|
|
50
51
|
validated?: boolean;
|
|
51
52
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BulkHeaderFile.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAE1E,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAI7C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb,IAAI,CAAC,EAAE,UAAU,CAAA;IAEjB
|
|
1
|
+
{"version":3,"file":"BulkHeaderFile.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -135,11 +135,11 @@ class BulkHeaderFileStorage extends BulkHeaderFile {
|
|
|
135
135
|
async ensureData() {
|
|
136
136
|
if (this.data != null)
|
|
137
137
|
return this.data;
|
|
138
|
-
if (!this.sourceUrl ||
|
|
138
|
+
if (!this.sourceUrl || this.fetch == null) {
|
|
139
139
|
throw new WERR_errors_1.WERR_INVALID_PARAMETER('sourceUrl and fetch', 'defined. Or data must be defined.');
|
|
140
140
|
}
|
|
141
141
|
const url = this.fetch.pathJoin(this.sourceUrl, this.fileName);
|
|
142
|
-
this.data = await this.fetch.download(url);
|
|
142
|
+
this.data = await this.fetch.download(url, this.count * 80);
|
|
143
143
|
if (!this.data)
|
|
144
144
|
throw new WERR_errors_1.WERR_INVALID_OPERATION(`failed to download data from ${url}`);
|
|
145
145
|
if (this.validated) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BulkHeaderFile.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAI3C,kCAA+B;AAE/B,6DAA4F;AAC5F,yFAA+E;
|
|
1
|
+
{"version":3,"file":"BulkHeaderFile.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { HttpClient } from '@bsv/sdk';
|
|
2
|
-
import { ChaintracksFetchApi } from '../Api/ChaintracksFetchApi';
|
|
2
|
+
import { ChaintracksDownloadOptions, ChaintracksFetchApi } from '../Api/ChaintracksFetchApi';
|
|
3
|
+
export interface ChaintracksFetchOptions {
|
|
4
|
+
/** Number of retries after the initial request. Defaults to three. */
|
|
5
|
+
maxRetries?: number;
|
|
6
|
+
/** Deadline covering connection, headers, and response body. */
|
|
7
|
+
timeoutMsecs?: number;
|
|
8
|
+
/** Maximum materialized response size for binary and JSON requests. */
|
|
9
|
+
maxResponseBytes?: number;
|
|
10
|
+
retryMsecs?: number;
|
|
11
|
+
maxRetryMsecs?: number;
|
|
12
|
+
/** Testable jitter source in the inclusive range 0..1. */
|
|
13
|
+
random?: () => number;
|
|
14
|
+
}
|
|
3
15
|
export declare class ChaintracksFetchError extends Error {
|
|
4
16
|
readonly url: string;
|
|
5
17
|
readonly status: number;
|
|
@@ -9,13 +21,28 @@ export declare class ChaintracksFetchError extends Error {
|
|
|
9
21
|
get retryable(): boolean;
|
|
10
22
|
}
|
|
11
23
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
24
|
+
* Bounded fetch implementation shared by ChainTracks sources.
|
|
25
|
+
*
|
|
26
|
+
* Retry policy lives here so callers never multiply attempts. Every attempt
|
|
27
|
+
* has a deadline that remains active while the response body is consumed, and
|
|
28
|
+
* every materialized response has an explicit byte ceiling.
|
|
14
29
|
*/
|
|
15
30
|
export declare class ChaintracksFetch implements ChaintracksFetchApi {
|
|
16
31
|
httpClient: HttpClient;
|
|
17
|
-
|
|
32
|
+
private readonly maxRetries;
|
|
33
|
+
private readonly timeoutMsecs;
|
|
34
|
+
private readonly maxResponseBytes;
|
|
35
|
+
private readonly retryMsecs;
|
|
36
|
+
private readonly maxRetryMsecs;
|
|
37
|
+
private readonly random;
|
|
38
|
+
constructor(options?: ChaintracksFetchOptions);
|
|
39
|
+
download(url: string, maxResponseBytes?: number, options?: ChaintracksDownloadOptions): Promise<Uint8Array>;
|
|
18
40
|
fetchJson<R>(url: string): Promise<R>;
|
|
41
|
+
private requestBytes;
|
|
42
|
+
private requestAttempt;
|
|
43
|
+
private readResponseBytes;
|
|
44
|
+
private responseTooLarge;
|
|
45
|
+
private retryWaitMsecs;
|
|
19
46
|
pathJoin(baseUrl: string, subpath: string): string;
|
|
20
47
|
}
|
|
21
48
|
//# sourceMappingURL=ChaintracksFetch.d.ts.map
|
|
@@ -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"}
|
|
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ChaintracksFetch = exports.ChaintracksFetchError = void 0;
|
|
4
4
|
const sdk_1 = require("@bsv/sdk");
|
|
5
5
|
const utilityHelpers_1 = require("../../../../utility/utilityHelpers");
|
|
6
|
-
const
|
|
6
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
7
7
|
const DEFAULT_RETRY_MSECS = 1000;
|
|
8
|
+
const DEFAULT_MAX_RETRY_MSECS = 2 * 60 * 1000;
|
|
9
|
+
const DEFAULT_TIMEOUT_MSECS = 30 * 1000;
|
|
10
|
+
const DEFAULT_MAX_RESPONSE_BYTES = 16 * 1024 * 1024;
|
|
8
11
|
class ChaintracksFetchError extends Error {
|
|
9
12
|
url;
|
|
10
13
|
status;
|
|
@@ -19,7 +22,7 @@ class ChaintracksFetchError extends Error {
|
|
|
19
22
|
this.name = 'ChaintracksFetchError';
|
|
20
23
|
}
|
|
21
24
|
get retryable() {
|
|
22
|
-
return isRetryableHttpStatus(this.status);
|
|
25
|
+
return this.status === 0 || isRetryableHttpStatus(this.status);
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
exports.ChaintracksFetchError = ChaintracksFetchError;
|
|
@@ -38,70 +41,145 @@ function retryAfterMsecs(response) {
|
|
|
38
41
|
return undefined;
|
|
39
42
|
return Math.max(0, dateMsecs - Date.now());
|
|
40
43
|
}
|
|
41
|
-
function retryWaitMsecs(retry, retryAfter) {
|
|
42
|
-
return Math.min(retryAfter ?? DEFAULT_RETRY_MSECS * (retry + 1), 2 * 60 * 1000);
|
|
43
|
-
}
|
|
44
|
-
async function waitIfRetryable(response, retry) {
|
|
45
|
-
if (!isRetryableHttpStatus(response.status) || retry >= MAX_RETRIES)
|
|
46
|
-
return false;
|
|
47
|
-
await (0, utilityHelpers_1.wait)(retryWaitMsecs(retry, retryAfterMsecs(response)));
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
44
|
function fetchError(url, response, kind) {
|
|
51
45
|
const retryAfter = retryAfterMsecs(response);
|
|
52
46
|
return new ChaintracksFetchError(`Failed to ${kind} from ${url}: ${response.status} ${response.statusText}`, url, response.status, response.statusText, retryAfter);
|
|
53
47
|
}
|
|
48
|
+
function positiveSafeInteger(value, fallback, name) {
|
|
49
|
+
const resolved = value ?? fallback;
|
|
50
|
+
if (!Number.isSafeInteger(resolved) || resolved < 1) {
|
|
51
|
+
throw new Error(`${name} must be a positive safe integer`);
|
|
52
|
+
}
|
|
53
|
+
return resolved;
|
|
54
|
+
}
|
|
54
55
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
56
|
+
* Bounded fetch implementation shared by ChainTracks sources.
|
|
57
|
+
*
|
|
58
|
+
* Retry policy lives here so callers never multiply attempts. Every attempt
|
|
59
|
+
* has a deadline that remains active while the response body is consumed, and
|
|
60
|
+
* every materialized response has an explicit byte ceiling.
|
|
57
61
|
*/
|
|
58
62
|
class ChaintracksFetch {
|
|
59
63
|
httpClient = (0, sdk_1.defaultHttpClient)();
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
continue;
|
|
71
|
-
throw fetchError(url, response, 'download');
|
|
72
|
-
}
|
|
73
|
-
const data = await response.arrayBuffer();
|
|
74
|
-
return new Uint8Array(data);
|
|
64
|
+
maxRetries;
|
|
65
|
+
timeoutMsecs;
|
|
66
|
+
maxResponseBytes;
|
|
67
|
+
retryMsecs;
|
|
68
|
+
maxRetryMsecs;
|
|
69
|
+
random;
|
|
70
|
+
constructor(options = {}) {
|
|
71
|
+
const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
72
|
+
if (!Number.isSafeInteger(maxRetries) || maxRetries < 0) {
|
|
73
|
+
throw new Error('maxRetries must be a non-negative safe integer');
|
|
75
74
|
}
|
|
75
|
+
this.maxRetries = maxRetries;
|
|
76
|
+
this.timeoutMsecs = positiveSafeInteger(options.timeoutMsecs, DEFAULT_TIMEOUT_MSECS, 'timeoutMsecs');
|
|
77
|
+
this.maxResponseBytes = positiveSafeInteger(options.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES, 'maxResponseBytes');
|
|
78
|
+
this.retryMsecs = positiveSafeInteger(options.retryMsecs, DEFAULT_RETRY_MSECS, 'retryMsecs');
|
|
79
|
+
this.maxRetryMsecs = positiveSafeInteger(options.maxRetryMsecs, DEFAULT_MAX_RETRY_MSECS, 'maxRetryMsecs');
|
|
80
|
+
this.random = options.random ?? Math.random;
|
|
81
|
+
}
|
|
82
|
+
async download(url, maxResponseBytes, options) {
|
|
83
|
+
const responseLimit = maxResponseBytes == null
|
|
84
|
+
? this.maxResponseBytes
|
|
85
|
+
: Math.min(this.maxResponseBytes, positiveSafeInteger(maxResponseBytes, this.maxResponseBytes, 'maxResponseBytes'));
|
|
86
|
+
return await this.requestBytes(url, {
|
|
87
|
+
method: 'GET',
|
|
88
|
+
headers: { Accept: 'application/octet-stream' }
|
|
89
|
+
}, 'download', responseLimit, options);
|
|
76
90
|
}
|
|
77
91
|
async fetchJson(url) {
|
|
78
|
-
const
|
|
92
|
+
const bytes = await this.requestBytes(url, {
|
|
79
93
|
method: 'GET',
|
|
80
|
-
headers: {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
94
|
+
headers: { Accept: 'application/json' }
|
|
95
|
+
}, 'fetch JSON', this.maxResponseBytes);
|
|
96
|
+
return JSON.parse(new TextDecoder().decode(bytes));
|
|
97
|
+
}
|
|
98
|
+
async requestBytes(url, init, kind, maxResponseBytes, downloadOptions) {
|
|
85
99
|
for (let retry = 0;; retry++) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
100
|
+
if (retry > 0)
|
|
101
|
+
await downloadOptions?.beforeRetry?.(retry + 1);
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMsecs);
|
|
104
|
+
try {
|
|
105
|
+
return await this.requestAttempt(url, init, kind, maxResponseBytes, controller);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const timedOut = controller.signal.aborted;
|
|
109
|
+
let fetchFailure;
|
|
110
|
+
if (error instanceof ChaintracksFetchError)
|
|
111
|
+
fetchFailure = error;
|
|
112
|
+
else {
|
|
113
|
+
fetchFailure = new ChaintracksFetchError(`Failed to ${kind} from ${url}: ${timedOut ? 'request timed out' : String(error)}`, url, 0, timedOut ? 'Request Timeout' : 'Network Error');
|
|
114
|
+
}
|
|
115
|
+
if (!fetchFailure.retryable || retry >= this.maxRetries)
|
|
116
|
+
throw fetchFailure;
|
|
117
|
+
await (0, utilityHelpers_1.wait)(this.retryWaitMsecs(retry, fetchFailure.retryAfterMsecs));
|
|
91
118
|
}
|
|
92
|
-
|
|
93
|
-
|
|
119
|
+
finally {
|
|
120
|
+
clearTimeout(timeout);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async requestAttempt(url, init, kind, maxResponseBytes, controller) {
|
|
125
|
+
const response = await fetch(url, { ...init, signal: controller.signal });
|
|
126
|
+
if (!response.ok) {
|
|
127
|
+
await response.body?.cancel().catch(() => undefined);
|
|
128
|
+
throw fetchError(url, response, kind);
|
|
129
|
+
}
|
|
130
|
+
return await this.readResponseBytes(url, response, kind, maxResponseBytes);
|
|
131
|
+
}
|
|
132
|
+
async readResponseBytes(url, response, kind, maxResponseBytes) {
|
|
133
|
+
const contentLength = Number(response.headers.get('content-length'));
|
|
134
|
+
if (Number.isFinite(contentLength) && contentLength > maxResponseBytes) {
|
|
135
|
+
await response.body?.cancel().catch(() => undefined);
|
|
136
|
+
throw this.responseTooLarge(url, response, kind, contentLength, maxResponseBytes);
|
|
137
|
+
}
|
|
138
|
+
if (response.body == null)
|
|
139
|
+
return new Uint8Array();
|
|
140
|
+
const reader = response.body.getReader();
|
|
141
|
+
const chunks = [];
|
|
142
|
+
let total = 0;
|
|
143
|
+
try {
|
|
144
|
+
for (;;) {
|
|
145
|
+
const { done, value } = await reader.read();
|
|
146
|
+
if (done)
|
|
147
|
+
break;
|
|
148
|
+
total += value.length;
|
|
149
|
+
if (total > maxResponseBytes) {
|
|
150
|
+
await reader.cancel().catch(() => undefined);
|
|
151
|
+
throw this.responseTooLarge(url, response, kind, total, maxResponseBytes);
|
|
152
|
+
}
|
|
153
|
+
chunks.push(value);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
reader.releaseLock();
|
|
94
158
|
}
|
|
95
|
-
|
|
159
|
+
const bytes = new Uint8Array(total);
|
|
160
|
+
let offset = 0;
|
|
161
|
+
for (const chunk of chunks) {
|
|
162
|
+
bytes.set(chunk, offset);
|
|
163
|
+
offset += chunk.length;
|
|
164
|
+
}
|
|
165
|
+
return bytes;
|
|
166
|
+
}
|
|
167
|
+
responseTooLarge(url, response, kind, observedBytes, maxResponseBytes) {
|
|
168
|
+
return new ChaintracksFetchError(`Failed to ${kind} from ${url}: response exceeded ${maxResponseBytes} bytes ` +
|
|
169
|
+
`(observed at least ${observedBytes})`, url, response.status, 'Response Too Large');
|
|
170
|
+
}
|
|
171
|
+
retryWaitMsecs(retry, retryAfter) {
|
|
172
|
+
if (retryAfter != null)
|
|
173
|
+
return Math.min(retryAfter, this.maxRetryMsecs);
|
|
174
|
+
const exponential = Math.min(this.retryMsecs * 2 ** retry, this.maxRetryMsecs);
|
|
175
|
+
const jitter = 0.75 + Math.min(1, Math.max(0, this.random())) * 0.5;
|
|
176
|
+
return Math.min(Math.round(exponential * jitter), this.maxRetryMsecs);
|
|
96
177
|
}
|
|
97
178
|
pathJoin(baseUrl, subpath) {
|
|
98
|
-
// Ensure the subpath doesn't start with a slash to avoid issues
|
|
99
179
|
const cleanSubpath = subpath.replace(/^\/+/, '');
|
|
100
180
|
if (!baseUrl.endsWith('/'))
|
|
101
181
|
baseUrl += '/';
|
|
102
|
-
|
|
103
|
-
const url = new URL(cleanSubpath, baseUrl);
|
|
104
|
-
return url.toString();
|
|
182
|
+
return new URL(cleanSubpath, baseUrl).toString();
|
|
105
183
|
}
|
|
106
184
|
}
|
|
107
185
|
exports.ChaintracksFetch = ChaintracksFetch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChaintracksFetch.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":";;;AAAA,kCAAwD;AAExD,uEAAyD;AAEzD,MAAM,
|
|
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"}
|