@bsv/sdk 2.0.12 → 2.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js +827 -0
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +1 -0
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +654 -0
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +1 -0
- package/dist/cjs/src/identity/IdentityClient.js +3 -3
- package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
- package/dist/cjs/src/identity/types/index.js +1 -1
- package/dist/cjs/src/identity/types/index.js.map +1 -1
- package/dist/cjs/src/storage/StorageUploader.js +315 -96
- package/dist/cjs/src/storage/StorageUploader.js.map +1 -1
- package/dist/cjs/src/storage/index.js +3 -1
- package/dist/cjs/src/storage/index.js.map +1 -1
- package/dist/cjs/src/transaction/MerklePath.js +132 -0
- package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
- package/dist/cjs/src/wallet/WERR_REVIEW_ACTIONS.js +2 -2
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js +825 -0
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +1 -0
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +619 -0
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +1 -0
- package/dist/esm/src/identity/IdentityClient.js +3 -3
- package/dist/esm/src/identity/IdentityClient.js.map +1 -1
- package/dist/esm/src/identity/types/index.js +1 -1
- package/dist/esm/src/identity/types/index.js.map +1 -1
- package/dist/esm/src/storage/StorageUploader.js +319 -95
- package/dist/esm/src/storage/StorageUploader.js.map +1 -1
- package/dist/esm/src/storage/index.js +1 -1
- package/dist/esm/src/storage/index.js.map +1 -1
- package/dist/esm/src/transaction/MerklePath.js +132 -0
- package/dist/esm/src/transaction/MerklePath.js.map +1 -1
- package/dist/esm/src/wallet/WERR_REVIEW_ACTIONS.js +2 -2
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts +21 -0
- package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts.map +1 -0
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts +2 -0
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts.map +1 -0
- package/dist/types/src/storage/StorageUploader.d.ts +94 -55
- package/dist/types/src/storage/StorageUploader.d.ts.map +1 -1
- package/dist/types/src/storage/index.d.ts +1 -1
- package/dist/types/src/storage/index.d.ts.map +1 -1
- package/dist/types/src/transaction/MerklePath.d.ts +27 -0
- package/dist/types/src/transaction/MerklePath.d.ts.map +1 -1
- package/dist/types/src/wallet/WERR_REVIEW_ACTIONS.d.ts +2 -2
- package/dist/types/src/wallet/Wallet.interfaces.d.ts +2 -2
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +4 -4
- package/dist/umd/bundle.js.map +1 -1
- package/docs/index.md +3 -1
- package/docs/reference/identity.md +1 -1
- package/docs/reference/storage.md +215 -86
- package/docs/reference/transaction.md +40 -0
- package/docs/reference/wallet.md +4 -4
- package/package.json +1 -1
- package/src/auth/clients/__tests__/AuthFetch.additional.test.ts +1131 -0
- package/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.ts +770 -0
- package/src/compat/__tests/Mnemonic.additional.test.ts +64 -0
- package/src/identity/IdentityClient.ts +3 -3
- package/src/identity/__tests/IdentityClient.additional.test.ts +767 -0
- package/src/identity/types/index.ts +1 -1
- package/src/kvstore/__tests/LocalKVStore.additional.test.ts +611 -0
- package/src/kvstore/__tests/kvStoreInterpreter.test.ts +327 -0
- package/src/overlay-tools/__tests/HostReputationTracker.additional.test.ts +561 -0
- package/src/overlay-tools/__tests/LookupResolver.additional.test.ts +612 -0
- package/src/overlay-tools/__tests/withDoubleSpendRetry.test.ts +278 -0
- package/src/primitives/__tests/BigNumber.additional.test.ts +79 -0
- package/src/primitives/__tests/Curve.additional.test.ts +208 -0
- package/src/primitives/__tests/ECDSA.additional.test.ts +122 -0
- package/src/primitives/__tests/Hash.additional.test.ts +59 -0
- package/src/primitives/__tests/JacobianPoint.test.ts +308 -0
- package/src/primitives/__tests/Point.additional.test.ts +503 -0
- package/src/primitives/__tests/PublicKey.additional.test.ts +383 -0
- package/src/primitives/__tests/Random.additional.test.ts +262 -0
- package/src/primitives/__tests/Signature.test.ts +333 -0
- package/src/primitives/__tests/TransactionSignature.additional.test.ts +241 -0
- package/src/registry/__tests/RegistryClient.additional.test.ts +750 -0
- package/src/remittance/__tests/BasicBRC29.additional.test.ts +657 -0
- package/src/remittance/__tests/RemittanceManager.additional.test.ts +1272 -0
- package/src/script/__tests/LockingUnlockingScript.test.ts +79 -0
- package/src/script/__tests/Script.additional.test.ts +100 -0
- package/src/script/__tests/ScriptEvaluationError.test.ts +98 -0
- package/src/script/__tests/Spend.additional.test.ts +837 -0
- package/src/script/templates/__tests/RPuzzle.test.ts +134 -0
- package/src/storage/StorageUploader.ts +427 -105
- package/src/storage/__tests/StorageUploader.test.ts +881 -64
- package/src/storage/index.ts +1 -1
- package/src/transaction/MerklePath.ts +155 -0
- package/src/transaction/__tests/BeefParty.additional.test.ts +22 -0
- package/src/transaction/__tests/Broadcaster.test.ts +159 -0
- package/src/transaction/__tests/MerklePath.bench.test.ts +105 -0
- package/src/transaction/__tests/MerklePath.test.ts +80 -0
- package/src/transaction/__tests/Transaction.additional.test.ts +225 -0
- package/src/transaction/broadcasters/__tests/ARC.additional.test.ts +585 -0
- package/src/transaction/broadcasters/__tests/Teranode.test.ts +349 -0
- package/src/transaction/chaintrackers/__tests/BlockHeadersService.test.ts +253 -0
- package/src/transaction/chaintrackers/__tests/DefaultChainTracker.test.ts +44 -0
- package/src/transaction/chaintrackers/__tests/WhatsOnChain.additional.test.ts +193 -0
- package/src/transaction/fee-models/__tests/SatoshisPerKilobyte.test.ts +262 -0
- package/src/transaction/http/__tests/BinaryFetchClient.test.ts +212 -0
- package/src/transaction/http/__tests/DefaultHttpClient.additional.test.ts +192 -0
- package/src/transaction/http/__tests/DefaultHttpClient.test.ts +71 -0
- package/src/wallet/WERR_REVIEW_ACTIONS.ts +2 -2
- package/src/wallet/Wallet.interfaces.ts +2 -2
- package/src/wallet/__tests/ProtoWallet.additional.test.ts +134 -0
- package/src/wallet/__tests/WERR.test.ts +212 -0
- package/src/wallet/__tests/WalletClient.additional.test.ts +699 -0
- package/src/wallet/__tests/WalletClient.substrate.test.ts +759 -0
- package/src/wallet/__tests/WalletError.test.ts +290 -0
- package/src/wallet/__tests/validationHelpers.test.ts +1218 -0
- package/src/wallet/substrates/__tests/HTTPWalletJSON.test.ts +496 -0
- package/src/wallet/substrates/__tests/HTTPWalletWire.test.ts +273 -0
|
@@ -1,38 +1,87 @@
|
|
|
1
1
|
import { AuthFetch } from '../auth/clients/AuthFetch.js';
|
|
2
2
|
import * as StorageUtils from './StorageUtils.js';
|
|
3
|
+
/** Default UHRP storage providers used when the caller passes no host list. */
|
|
4
|
+
export const DEFAULT_UHRP_SERVERS = [
|
|
5
|
+
'https://nanostore.babbage.systems',
|
|
6
|
+
'https://bsv-storage-cloudflare.dev-a3e.workers.dev'
|
|
7
|
+
];
|
|
3
8
|
/**
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
*
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
* Thrown by `renewFile` when successful renewals fall below the resilience
|
|
10
|
+
* threshold. Per-host outcomes are attached so callers can reconcile which
|
|
11
|
+
* providers were billed.
|
|
12
|
+
*/
|
|
13
|
+
export class RenewResiliencyError extends Error {
|
|
14
|
+
results;
|
|
15
|
+
requiredSuccesses;
|
|
16
|
+
successCount;
|
|
17
|
+
constructor(message, results, requiredSuccesses, successCount) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'RenewResiliencyError';
|
|
20
|
+
this.results = results;
|
|
21
|
+
this.requiredSuccesses = requiredSuccesses;
|
|
22
|
+
this.successCount = successCount;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Client for publishing, finding, listing, and renewing UHRP-hosted files
|
|
27
|
+
* across one or more storage providers.
|
|
9
28
|
*/
|
|
10
29
|
export class StorageUploader {
|
|
11
30
|
authFetch;
|
|
31
|
+
hosts;
|
|
32
|
+
resilienceLevel;
|
|
33
|
+
/** Primary host used for non-upload operations. */
|
|
12
34
|
baseURL;
|
|
13
|
-
/**
|
|
14
|
-
* Creates a new StorageUploader instance.
|
|
15
|
-
* @param {UploaderConfig} config - An object containing the storage server's URL and a wallet interface
|
|
16
|
-
*/
|
|
17
35
|
constructor(config) {
|
|
18
|
-
|
|
36
|
+
const legacySingleHost = config.storageURLs === undefined && typeof config.storageURL === 'string';
|
|
37
|
+
let hosts;
|
|
38
|
+
if (config.storageURLs !== undefined) {
|
|
39
|
+
if (config.storageURLs.length === 0) {
|
|
40
|
+
throw new Error('StorageUploader requires at least one storage provider.');
|
|
41
|
+
}
|
|
42
|
+
hosts = [...config.storageURLs];
|
|
43
|
+
}
|
|
44
|
+
else if (typeof config.storageURL === 'string') {
|
|
45
|
+
hosts = [config.storageURL];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
hosts = [...DEFAULT_UHRP_SERVERS];
|
|
49
|
+
}
|
|
50
|
+
const requestedLevel = config.resilienceLevel ?? 1;
|
|
51
|
+
if (!Number.isInteger(requestedLevel) || requestedLevel < 1) {
|
|
52
|
+
throw new Error('resilienceLevel must be a positive integer.');
|
|
53
|
+
}
|
|
54
|
+
// Legacy `storageURL` callers must not start demanding extra replicas.
|
|
55
|
+
this.resilienceLevel = legacySingleHost ? 1 : requestedLevel;
|
|
56
|
+
this.hosts = hosts;
|
|
57
|
+
this.baseURL = hosts[0];
|
|
19
58
|
this.authFetch = new AuthFetch(config.wallet);
|
|
20
59
|
}
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
60
|
+
/** Returns `null` when the provider is unreachable or errors out. */
|
|
61
|
+
async getQuote(host, fileSize, retentionPeriod) {
|
|
62
|
+
try {
|
|
63
|
+
const response = await fetch(`${host}/quote`, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: { 'Content-Type': 'application/json' },
|
|
66
|
+
body: JSON.stringify({ fileSize, retentionPeriod })
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok)
|
|
69
|
+
return null;
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
if (data.status === 'error' || typeof data.quote !== 'number')
|
|
72
|
+
return null;
|
|
73
|
+
return { host, amount: data.quote };
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Drives the authenticated `/upload` route; `AuthFetch` handles the 402 payment flow. */
|
|
80
|
+
async getUploadURL(host, fileSize, retentionPeriod) {
|
|
81
|
+
const response = await this.authFetch.fetch(`${host}/upload`, {
|
|
33
82
|
method: 'POST',
|
|
34
83
|
headers: { 'Content-Type': 'application/json' },
|
|
35
|
-
body: JSON.stringify(
|
|
84
|
+
body: JSON.stringify({ fileSize, retentionPeriod })
|
|
36
85
|
});
|
|
37
86
|
if (!response.ok) {
|
|
38
87
|
throw new Error(`Upload info request failed: HTTP ${response.status}`);
|
|
@@ -47,63 +96,101 @@ export class StorageUploader {
|
|
|
47
96
|
amount: data.amount
|
|
48
97
|
};
|
|
49
98
|
}
|
|
50
|
-
|
|
51
|
-
* Performs the actual file upload (HTTP PUT) to the presigned URL returned by the server.
|
|
52
|
-
* @private
|
|
53
|
-
* @param {string} uploadURL - The presigned URL where the file is to be uploaded
|
|
54
|
-
* @param {UploadableFile} file - The file to upload, including its raw data and MIME type
|
|
55
|
-
* @param {Record<string, string>} requiredHeaders - Additional headers required by the server (e.g. content-length)
|
|
56
|
-
* @returns {Promise<UploadFileResult>} An object indicating whether publishing was successful and the resulting UHRP URL
|
|
57
|
-
* @throws {Error} If the server returns a non-OK response
|
|
58
|
-
*/
|
|
59
|
-
async uploadFile(uploadURL, file, requiredHeaders) {
|
|
60
|
-
const body = file.data instanceof Uint8Array ? file.data : Uint8Array.from(file.data);
|
|
99
|
+
async putFile(uploadURL, data, contentType, requiredHeaders) {
|
|
61
100
|
const response = await fetch(uploadURL, {
|
|
62
101
|
method: 'PUT',
|
|
63
|
-
body:
|
|
102
|
+
body: data,
|
|
64
103
|
headers: {
|
|
65
|
-
'Content-Type':
|
|
104
|
+
'Content-Type': contentType,
|
|
66
105
|
...requiredHeaders
|
|
67
106
|
}
|
|
68
107
|
});
|
|
69
108
|
if (!response.ok) {
|
|
70
109
|
throw new Error(`File upload failed: HTTP ${response.status}`);
|
|
71
110
|
}
|
|
72
|
-
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Collects quotes in parallel batches, shrinking each batch to only the
|
|
114
|
+
* remaining quotes still needed so we never over-query once the quote
|
|
115
|
+
* budget is satisfied.
|
|
116
|
+
*/
|
|
117
|
+
async collectQuotes(fileSize, retentionPeriod, maxNeeded) {
|
|
118
|
+
const quotes = [];
|
|
119
|
+
let index = 0;
|
|
120
|
+
while (index < this.hosts.length && quotes.length < maxNeeded) {
|
|
121
|
+
const remaining = maxNeeded - quotes.length;
|
|
122
|
+
const batch = this.hosts.slice(index, index + remaining);
|
|
123
|
+
index += batch.length;
|
|
124
|
+
const results = await Promise.all(batch.map(async (host) => await this.getQuote(host, fileSize, retentionPeriod)));
|
|
125
|
+
for (const quote of results) {
|
|
126
|
+
if (quote !== null && quotes.length < maxNeeded) {
|
|
127
|
+
quotes.push(quote);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return quotes;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Queries the unauthenticated `/quote` endpoint on up to `2 * resilienceLevel`
|
|
135
|
+
* providers and returns the cheapest-first quote list plus the aggregate
|
|
136
|
+
* cost `publishFile` would pay. No provider is billed.
|
|
137
|
+
*/
|
|
138
|
+
async estimateCost(params) {
|
|
139
|
+
const { fileSize, retentionPeriod } = params;
|
|
140
|
+
const quotes = await this.collectQuotes(fileSize, retentionPeriod, this.resilienceLevel * 2);
|
|
141
|
+
quotes.sort((a, b) => a.amount - b.amount);
|
|
142
|
+
const meetsResilienceThreshold = quotes.length >= this.resilienceLevel;
|
|
143
|
+
const budget = meetsResilienceThreshold ? quotes.slice(0, this.resilienceLevel) : quotes;
|
|
144
|
+
const totalForResilience = budget.reduce((sum, q) => sum + q.amount, 0);
|
|
73
145
|
return {
|
|
74
|
-
|
|
75
|
-
|
|
146
|
+
quotes: quotes.map(q => ({ host: q.host, amount: q.amount })),
|
|
147
|
+
resilienceLevel: this.resilienceLevel,
|
|
148
|
+
totalForResilience,
|
|
149
|
+
meetsResilienceThreshold
|
|
76
150
|
};
|
|
77
151
|
}
|
|
78
152
|
/**
|
|
79
|
-
* Publishes a file
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* 1. Request an upload URL from the server.
|
|
83
|
-
* 2. Perform an HTTP PUT to upload the file’s raw bytes.
|
|
84
|
-
* 3. Return a UHRP URL referencing the file once published.
|
|
85
|
-
*
|
|
86
|
-
* @param {Object} params
|
|
87
|
-
* @param {UploadableFile} params.file - The file data + type
|
|
88
|
-
* @param {number} params.retentionPeriod - Number of minutes to host the file
|
|
89
|
-
* @returns {Promise<UploadFileResult>} An object with the file's UHRP URL
|
|
90
|
-
* @throws {Error} If the server or upload step returns a non-OK response
|
|
153
|
+
* Publishes a file across the cheapest configured providers, falling
|
|
154
|
+
* through to the next-cheapest quote if a paid upload fails. Throws when
|
|
155
|
+
* the resilience threshold cannot be met.
|
|
91
156
|
*/
|
|
92
157
|
async publishFile(params) {
|
|
93
158
|
const { file, retentionPeriod } = params;
|
|
94
159
|
const data = file.data instanceof Uint8Array ? file.data : Uint8Array.from(file.data);
|
|
95
160
|
const fileSize = data.byteLength;
|
|
96
|
-
const
|
|
97
|
-
|
|
161
|
+
const estimate = await this.estimateCost({ fileSize, retentionPeriod });
|
|
162
|
+
if (!estimate.meetsResilienceThreshold) {
|
|
163
|
+
throw new Error(`Resiliency threshold of ${this.resilienceLevel} could not be met: ` +
|
|
164
|
+
`only ${estimate.quotes.length} of ${this.hosts.length} provider(s) responded with quotes.`);
|
|
165
|
+
}
|
|
166
|
+
const uhrpURL = StorageUtils.getURLForFile(data);
|
|
167
|
+
const hostedBy = [];
|
|
168
|
+
const failures = [];
|
|
169
|
+
for (const quote of estimate.quotes) {
|
|
170
|
+
if (hostedBy.length >= this.resilienceLevel)
|
|
171
|
+
break;
|
|
172
|
+
try {
|
|
173
|
+
const { uploadURL, requiredHeaders } = await this.getUploadURL(quote.host, fileSize, retentionPeriod);
|
|
174
|
+
await this.putFile(uploadURL, data, file.type, requiredHeaders);
|
|
175
|
+
hostedBy.push(quote.host);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
failures.push({ host: quote.host, error: e.message });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (hostedBy.length < this.resilienceLevel) {
|
|
182
|
+
const detail = failures.map(f => `${f.host}: ${f.error}`).join('; ');
|
|
183
|
+
throw new Error(`Resiliency threshold of ${this.resilienceLevel} could not be met: ` +
|
|
184
|
+
`only ${hostedBy.length} upload(s) succeeded. Failures — ${detail}`);
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
published: true,
|
|
188
|
+
uhrpURL,
|
|
189
|
+
hostedBy
|
|
190
|
+
};
|
|
98
191
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* @param {string} uhrpUrl - The UHRP URL, e.g. "uhrp://abcd..."
|
|
102
|
-
* @returns {Promise<FindFileData>} An object with file name, size, MIME type, and expiry time
|
|
103
|
-
* @throws {Error} If the server or the route returns an error
|
|
104
|
-
*/
|
|
105
|
-
async findFile(uhrpUrl) {
|
|
106
|
-
const url = new URL(`${this.baseURL}/find`);
|
|
192
|
+
async findFileAtHost(host, uhrpUrl) {
|
|
193
|
+
const url = new URL(`${host}/find`);
|
|
107
194
|
url.searchParams.set('uhrpUrl', uhrpUrl);
|
|
108
195
|
const response = await this.authFetch.fetch(url.toString(), {
|
|
109
196
|
method: 'GET'
|
|
@@ -119,59 +206,196 @@ export class StorageUploader {
|
|
|
119
206
|
}
|
|
120
207
|
return data.data;
|
|
121
208
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
async listUploads() {
|
|
128
|
-
const url = `${this.baseURL}/list`;
|
|
129
|
-
const response = await this.authFetch.fetch(url, {
|
|
130
|
-
method: 'GET'
|
|
209
|
+
async renewFileAtHost(host, uhrpUrl, additionalMinutes) {
|
|
210
|
+
const response = await this.authFetch.fetch(`${host}/renew`, {
|
|
211
|
+
method: 'POST',
|
|
212
|
+
headers: { 'Content-Type': 'application/json' },
|
|
213
|
+
body: JSON.stringify({ uhrpUrl, additionalMinutes })
|
|
131
214
|
});
|
|
132
215
|
if (!response.ok) {
|
|
133
|
-
throw new Error(`
|
|
216
|
+
throw new Error(`renewFile request failed: HTTP ${response.status}`);
|
|
134
217
|
}
|
|
135
218
|
const data = await response.json();
|
|
136
219
|
if (data.status === 'error') {
|
|
137
220
|
const errCode = data.code ?? 'unknown-code';
|
|
138
221
|
const errDesc = data.description ?? 'no-description';
|
|
139
|
-
throw new Error(`
|
|
222
|
+
throw new Error(`renewFile returned an error: ${errCode} - ${errDesc}`);
|
|
140
223
|
}
|
|
141
|
-
return
|
|
224
|
+
return {
|
|
225
|
+
status: data.status,
|
|
226
|
+
prevExpiryTime: data.prevExpiryTime,
|
|
227
|
+
newExpiryTime: data.newExpiryTime,
|
|
228
|
+
amount: data.amount
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/** Intersects `hostedBy` with the configured host set; throws when empty. */
|
|
232
|
+
resolveTargets(hostedBy) {
|
|
233
|
+
if (hostedBy === undefined)
|
|
234
|
+
return this.hosts;
|
|
235
|
+
const configured = new Set(this.hosts);
|
|
236
|
+
const intersection = hostedBy.filter(h => configured.has(h));
|
|
237
|
+
if (intersection.length === 0) {
|
|
238
|
+
throw new Error('hostedBy did not intersect any configured provider. ' +
|
|
239
|
+
'Provide hosts that were also passed to the StorageUploader constructor.');
|
|
240
|
+
}
|
|
241
|
+
return intersection;
|
|
142
242
|
}
|
|
143
243
|
/**
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* @param {string} uhrpUrl - The UHRP URL of the file (e.g., "uhrp://abcd1234...")
|
|
149
|
-
* @param {number} additionalMinutes - The number of minutes to extend
|
|
150
|
-
* @returns {Promise<RenewFileResult>} An object with the new and previous expiry times, plus any cost
|
|
151
|
-
* @throws {Error} If the request fails or the server returns an error
|
|
244
|
+
* Fans `/find` out across configured hosts (UHRP storage is host-local,
|
|
245
|
+
* so any one host may not know the file) and returns the record with the
|
|
246
|
+
* longest remaining expiry. Single-host configurations preserve the
|
|
247
|
+
* legacy error-message contract verbatim.
|
|
152
248
|
*/
|
|
153
|
-
async
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
249
|
+
async findFile(uhrpUrl, options = {}) {
|
|
250
|
+
const targets = this.resolveTargets(options.hostedBy);
|
|
251
|
+
const outcomes = await Promise.all(targets.map(async (host) => {
|
|
252
|
+
try {
|
|
253
|
+
return { ok: true, host, data: await this.findFileAtHost(host, uhrpUrl) };
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
return { ok: false, host, error: e };
|
|
257
|
+
}
|
|
258
|
+
}));
|
|
259
|
+
const successes = outcomes.flatMap(o => o.ok ? [o] : []);
|
|
260
|
+
if (successes.length === 0) {
|
|
261
|
+
const failures = outcomes.flatMap(o => o.ok ? [] : [o]);
|
|
262
|
+
if (targets.length === 1)
|
|
263
|
+
throw failures[0].error;
|
|
264
|
+
const detail = failures.map(f => `${f.host}: ${f.error.message}`).join('; ');
|
|
265
|
+
throw new Error(`findFile: no configured host reported this UHRP URL — ${detail}`);
|
|
266
|
+
}
|
|
267
|
+
successes.sort((a, b) => b.data.expiryTime - a.data.expiryTime);
|
|
268
|
+
const best = successes[0];
|
|
269
|
+
if (targets.length === 1) {
|
|
270
|
+
return best.data;
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
...best.data,
|
|
274
|
+
hostedBy: successes.map(s => s.host)
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Unions `/list` output across configured hosts, merging duplicate UHRP
|
|
279
|
+
* URLs by the longest expiry observed. One failing host does not hide
|
|
280
|
+
* the rest. Single-host configurations preserve the legacy error contract.
|
|
281
|
+
*/
|
|
282
|
+
async listUploads(options = {}) {
|
|
283
|
+
const targets = this.resolveTargets(options.hostedBy);
|
|
284
|
+
const outcomes = await Promise.all(targets.map(async (host) => {
|
|
285
|
+
try {
|
|
286
|
+
return { ok: true, host, data: await this.listUploadsAtHost(host) };
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
return { ok: false, host, error: e };
|
|
290
|
+
}
|
|
291
|
+
}));
|
|
292
|
+
const successes = outcomes.flatMap(o => o.ok ? [o] : []);
|
|
293
|
+
if (successes.length === 0) {
|
|
294
|
+
const failures = outcomes.flatMap(o => o.ok ? [] : [o]);
|
|
295
|
+
if (targets.length === 1)
|
|
296
|
+
throw failures[0].error;
|
|
297
|
+
const detail = failures.map(f => `${f.host}: ${f.error.message}`).join('; ');
|
|
298
|
+
throw new Error(`listUploads: no configured host returned a listing — ${detail}`);
|
|
299
|
+
}
|
|
300
|
+
if (targets.length === 1) {
|
|
301
|
+
return successes[0].data;
|
|
302
|
+
}
|
|
303
|
+
const merged = new Map();
|
|
304
|
+
for (const { host, data } of successes) {
|
|
305
|
+
if (!Array.isArray(data))
|
|
306
|
+
continue;
|
|
307
|
+
for (const entry of data) {
|
|
308
|
+
const key = entry?.uhrpUrl;
|
|
309
|
+
if (typeof key !== 'string')
|
|
310
|
+
continue;
|
|
311
|
+
const rawExpiry = Number(entry.expiryTime);
|
|
312
|
+
const expiry = Number.isFinite(rawExpiry) ? rawExpiry : 0;
|
|
313
|
+
const existing = merged.get(key);
|
|
314
|
+
if (existing === undefined) {
|
|
315
|
+
merged.set(key, { uhrpUrl: key, expiryTime: expiry, hostedBy: [host] });
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
existing.expiryTime = Math.max(existing.expiryTime, expiry);
|
|
319
|
+
if (!existing.hostedBy.includes(host))
|
|
320
|
+
existing.hostedBy.push(host);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return Array.from(merged.values());
|
|
325
|
+
}
|
|
326
|
+
async listUploadsAtHost(host) {
|
|
327
|
+
const response = await this.authFetch.fetch(`${host}/list`, { method: 'GET' });
|
|
161
328
|
if (!response.ok) {
|
|
162
|
-
throw new Error(`
|
|
329
|
+
throw new Error(`listUploads request failed: HTTP ${response.status}`);
|
|
163
330
|
}
|
|
164
331
|
const data = await response.json();
|
|
165
332
|
if (data.status === 'error') {
|
|
166
333
|
const errCode = data.code ?? 'unknown-code';
|
|
167
334
|
const errDesc = data.description ?? 'no-description';
|
|
168
|
-
throw new Error(`
|
|
335
|
+
throw new Error(`listUploads returned an error: ${errCode} - ${errDesc}`);
|
|
336
|
+
}
|
|
337
|
+
return data.uploads;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Fans `/renew` out across every configured host (each provider owns its
|
|
341
|
+
* own advertisement, so a single-host renewal would degrade resilience
|
|
342
|
+
* over time). Hosts that do not carry the file are not billed. Throws
|
|
343
|
+
* {@link RenewResiliencyError} when successful renewals fall below the
|
|
344
|
+
* resilience threshold.
|
|
345
|
+
*/
|
|
346
|
+
async renewFile(uhrpUrl, additionalMinutes, options = {}) {
|
|
347
|
+
const targets = this.resolveTargets(options.hostedBy);
|
|
348
|
+
// Single-host: pass the server's error through unchanged for legacy callers.
|
|
349
|
+
if (targets.length === 1) {
|
|
350
|
+
const data = await this.renewFileAtHost(targets[0], uhrpUrl, additionalMinutes);
|
|
351
|
+
return {
|
|
352
|
+
status: data.status,
|
|
353
|
+
prevExpiryTime: data.prevExpiryTime,
|
|
354
|
+
newExpiryTime: data.newExpiryTime,
|
|
355
|
+
amount: data.amount
|
|
356
|
+
};
|
|
169
357
|
}
|
|
358
|
+
const perHost = await Promise.all(targets.map(async (host) => {
|
|
359
|
+
try {
|
|
360
|
+
const data = await this.renewFileAtHost(host, uhrpUrl, additionalMinutes);
|
|
361
|
+
return {
|
|
362
|
+
result: {
|
|
363
|
+
host,
|
|
364
|
+
status: 'success',
|
|
365
|
+
prevExpiryTime: data.prevExpiryTime,
|
|
366
|
+
newExpiryTime: data.newExpiryTime,
|
|
367
|
+
amount: data.amount
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
catch (e) {
|
|
372
|
+
const err = e;
|
|
373
|
+
return {
|
|
374
|
+
result: { host, status: 'error', error: err.message },
|
|
375
|
+
raw: err
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}));
|
|
379
|
+
const outcomes = perHost.map(p => p.result);
|
|
380
|
+
const successes = outcomes.filter(o => o.status === 'success');
|
|
381
|
+
// Clamp to targets.length so an explicit `hostedBy` smaller than the
|
|
382
|
+
// configured resilience level doesn't trigger an impossible threshold.
|
|
383
|
+
const requiredSuccesses = Math.min(targets.length, this.resilienceLevel);
|
|
384
|
+
if (successes.length < requiredSuccesses) {
|
|
385
|
+
const detail = outcomes
|
|
386
|
+
.map(o => `${o.host}: ${o.status === 'success' ? 'renewed' : (o.error ?? 'unknown')}`)
|
|
387
|
+
.join('; ');
|
|
388
|
+
throw new RenewResiliencyError(`renewFile: only ${successes.length} of ${requiredSuccesses} required hosts renewed — ${detail}`, outcomes, requiredSuccesses, successes.length);
|
|
389
|
+
}
|
|
390
|
+
successes.sort((a, b) => (b.newExpiryTime ?? 0) - (a.newExpiryTime ?? 0));
|
|
391
|
+
const primary = successes[0];
|
|
392
|
+
const totalAmount = successes.reduce((sum, s) => sum + (s.amount ?? 0), 0);
|
|
170
393
|
return {
|
|
171
|
-
status:
|
|
172
|
-
prevExpiryTime:
|
|
173
|
-
newExpiryTime:
|
|
174
|
-
amount:
|
|
394
|
+
status: 'success',
|
|
395
|
+
prevExpiryTime: primary.prevExpiryTime,
|
|
396
|
+
newExpiryTime: primary.newExpiryTime,
|
|
397
|
+
amount: totalAmount,
|
|
398
|
+
results: outcomes
|
|
175
399
|
};
|
|
176
400
|
}
|
|
177
401
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageUploader.js","sourceRoot":"","sources":["../../../../src/storage/StorageUploader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StorageUploader.js","sourceRoot":"","sources":["../../../../src/storage/StorageUploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * as StorageUtils from './StorageUtils.js';
|
|
2
|
-
export { StorageUploader } from './StorageUploader.js';
|
|
2
|
+
export { StorageUploader, DEFAULT_UHRP_SERVERS, RenewResiliencyError } from './StorageUploader.js';
|
|
3
3
|
export { StorageDownloader } from './StorageDownloader.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAElG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
|