@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.
Files changed (112) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/package.json +1 -1
  3. package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js +827 -0
  4. package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +1 -0
  5. package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +654 -0
  6. package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +1 -0
  7. package/dist/cjs/src/identity/IdentityClient.js +3 -3
  8. package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
  9. package/dist/cjs/src/identity/types/index.js +1 -1
  10. package/dist/cjs/src/identity/types/index.js.map +1 -1
  11. package/dist/cjs/src/storage/StorageUploader.js +315 -96
  12. package/dist/cjs/src/storage/StorageUploader.js.map +1 -1
  13. package/dist/cjs/src/storage/index.js +3 -1
  14. package/dist/cjs/src/storage/index.js.map +1 -1
  15. package/dist/cjs/src/transaction/MerklePath.js +132 -0
  16. package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
  17. package/dist/cjs/src/wallet/WERR_REVIEW_ACTIONS.js +2 -2
  18. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  19. package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js +825 -0
  20. package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +1 -0
  21. package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +619 -0
  22. package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +1 -0
  23. package/dist/esm/src/identity/IdentityClient.js +3 -3
  24. package/dist/esm/src/identity/IdentityClient.js.map +1 -1
  25. package/dist/esm/src/identity/types/index.js +1 -1
  26. package/dist/esm/src/identity/types/index.js.map +1 -1
  27. package/dist/esm/src/storage/StorageUploader.js +319 -95
  28. package/dist/esm/src/storage/StorageUploader.js.map +1 -1
  29. package/dist/esm/src/storage/index.js +1 -1
  30. package/dist/esm/src/storage/index.js.map +1 -1
  31. package/dist/esm/src/transaction/MerklePath.js +132 -0
  32. package/dist/esm/src/transaction/MerklePath.js.map +1 -1
  33. package/dist/esm/src/wallet/WERR_REVIEW_ACTIONS.js +2 -2
  34. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  35. package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts +21 -0
  36. package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts.map +1 -0
  37. package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts +2 -0
  38. package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts.map +1 -0
  39. package/dist/types/src/storage/StorageUploader.d.ts +94 -55
  40. package/dist/types/src/storage/StorageUploader.d.ts.map +1 -1
  41. package/dist/types/src/storage/index.d.ts +1 -1
  42. package/dist/types/src/storage/index.d.ts.map +1 -1
  43. package/dist/types/src/transaction/MerklePath.d.ts +27 -0
  44. package/dist/types/src/transaction/MerklePath.d.ts.map +1 -1
  45. package/dist/types/src/wallet/WERR_REVIEW_ACTIONS.d.ts +2 -2
  46. package/dist/types/src/wallet/Wallet.interfaces.d.ts +2 -2
  47. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  48. package/dist/umd/bundle.js +4 -4
  49. package/dist/umd/bundle.js.map +1 -1
  50. package/docs/index.md +3 -1
  51. package/docs/reference/identity.md +1 -1
  52. package/docs/reference/storage.md +215 -86
  53. package/docs/reference/transaction.md +40 -0
  54. package/docs/reference/wallet.md +4 -4
  55. package/package.json +1 -1
  56. package/src/auth/clients/__tests__/AuthFetch.additional.test.ts +1131 -0
  57. package/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.ts +770 -0
  58. package/src/compat/__tests/Mnemonic.additional.test.ts +64 -0
  59. package/src/identity/IdentityClient.ts +3 -3
  60. package/src/identity/__tests/IdentityClient.additional.test.ts +767 -0
  61. package/src/identity/types/index.ts +1 -1
  62. package/src/kvstore/__tests/LocalKVStore.additional.test.ts +611 -0
  63. package/src/kvstore/__tests/kvStoreInterpreter.test.ts +327 -0
  64. package/src/overlay-tools/__tests/HostReputationTracker.additional.test.ts +561 -0
  65. package/src/overlay-tools/__tests/LookupResolver.additional.test.ts +612 -0
  66. package/src/overlay-tools/__tests/withDoubleSpendRetry.test.ts +278 -0
  67. package/src/primitives/__tests/BigNumber.additional.test.ts +79 -0
  68. package/src/primitives/__tests/Curve.additional.test.ts +208 -0
  69. package/src/primitives/__tests/ECDSA.additional.test.ts +122 -0
  70. package/src/primitives/__tests/Hash.additional.test.ts +59 -0
  71. package/src/primitives/__tests/JacobianPoint.test.ts +308 -0
  72. package/src/primitives/__tests/Point.additional.test.ts +503 -0
  73. package/src/primitives/__tests/PublicKey.additional.test.ts +383 -0
  74. package/src/primitives/__tests/Random.additional.test.ts +262 -0
  75. package/src/primitives/__tests/Signature.test.ts +333 -0
  76. package/src/primitives/__tests/TransactionSignature.additional.test.ts +241 -0
  77. package/src/registry/__tests/RegistryClient.additional.test.ts +750 -0
  78. package/src/remittance/__tests/BasicBRC29.additional.test.ts +657 -0
  79. package/src/remittance/__tests/RemittanceManager.additional.test.ts +1272 -0
  80. package/src/script/__tests/LockingUnlockingScript.test.ts +79 -0
  81. package/src/script/__tests/Script.additional.test.ts +100 -0
  82. package/src/script/__tests/ScriptEvaluationError.test.ts +98 -0
  83. package/src/script/__tests/Spend.additional.test.ts +837 -0
  84. package/src/script/templates/__tests/RPuzzle.test.ts +134 -0
  85. package/src/storage/StorageUploader.ts +427 -105
  86. package/src/storage/__tests/StorageUploader.test.ts +881 -64
  87. package/src/storage/index.ts +1 -1
  88. package/src/transaction/MerklePath.ts +155 -0
  89. package/src/transaction/__tests/BeefParty.additional.test.ts +22 -0
  90. package/src/transaction/__tests/Broadcaster.test.ts +159 -0
  91. package/src/transaction/__tests/MerklePath.bench.test.ts +105 -0
  92. package/src/transaction/__tests/MerklePath.test.ts +80 -0
  93. package/src/transaction/__tests/Transaction.additional.test.ts +225 -0
  94. package/src/transaction/broadcasters/__tests/ARC.additional.test.ts +585 -0
  95. package/src/transaction/broadcasters/__tests/Teranode.test.ts +349 -0
  96. package/src/transaction/chaintrackers/__tests/BlockHeadersService.test.ts +253 -0
  97. package/src/transaction/chaintrackers/__tests/DefaultChainTracker.test.ts +44 -0
  98. package/src/transaction/chaintrackers/__tests/WhatsOnChain.additional.test.ts +193 -0
  99. package/src/transaction/fee-models/__tests/SatoshisPerKilobyte.test.ts +262 -0
  100. package/src/transaction/http/__tests/BinaryFetchClient.test.ts +212 -0
  101. package/src/transaction/http/__tests/DefaultHttpClient.additional.test.ts +192 -0
  102. package/src/transaction/http/__tests/DefaultHttpClient.test.ts +71 -0
  103. package/src/wallet/WERR_REVIEW_ACTIONS.ts +2 -2
  104. package/src/wallet/Wallet.interfaces.ts +2 -2
  105. package/src/wallet/__tests/ProtoWallet.additional.test.ts +134 -0
  106. package/src/wallet/__tests/WERR.test.ts +212 -0
  107. package/src/wallet/__tests/WalletClient.additional.test.ts +699 -0
  108. package/src/wallet/__tests/WalletClient.substrate.test.ts +759 -0
  109. package/src/wallet/__tests/WalletError.test.ts +290 -0
  110. package/src/wallet/__tests/validationHelpers.test.ts +1218 -0
  111. package/src/wallet/substrates/__tests/HTTPWalletJSON.test.ts +496 -0
  112. 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
- * The StorageUploader class provides client-side methods for:
5
- * - Uploading files with a specified retention period
6
- * - Finding file metadata by UHRP URL
7
- * - Listing all user uploads
8
- * - Renewing an existing advertisement's expiry time
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
- this.baseURL = config.storageURL;
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
- * Requests information from the server to upload a file (including presigned URL and headers).
23
- * @private
24
- * @param {number} fileSize - The size of the file, in bytes
25
- * @param {number} retentionPeriod - The desired hosting time, in minutes
26
- * @returns {Promise<{ uploadURL: string; requiredHeaders: Record<string, string>; amount?: number }>}
27
- * @throws {Error} If the server returns a non-OK response or an error status
28
- */
29
- async getUploadInfo(fileSize, retentionPeriod) {
30
- const url = `${this.baseURL}/upload`;
31
- const body = { fileSize, retentionPeriod };
32
- const response = await this.authFetch.fetch(url, {
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(body)
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: body,
102
+ body: data,
64
103
  headers: {
65
- 'Content-Type': file.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
- const uhrpURL = StorageUtils.getURLForFile(body);
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
- published: true,
75
- uhrpURL
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 to the storage server with the specified retention period.
80
- *
81
- * This will:
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 { uploadURL, requiredHeaders } = await this.getUploadInfo(fileSize, retentionPeriod);
97
- return await this.uploadFile(uploadURL, { data, type: file.type }, requiredHeaders);
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
- * Retrieves metadata for a file matching the given UHRP URL from the `/find` route.
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
- * Lists all advertisements belonging to the user from the `/list` route.
124
- * @returns {Promise<any>} The array of uploads returned by the server
125
- * @throws {Error} If the server or the route returns an error
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(`listUploads request failed: HTTP ${response.status}`);
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(`listUploads returned an error: ${errCode} - ${errDesc}`);
222
+ throw new Error(`renewFile returned an error: ${errCode} - ${errDesc}`);
140
223
  }
141
- return data.uploads;
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
- * Renews the hosting time for an existing file advertisement identified by uhrpUrl.
145
- * Calls the `/renew` route to add `additionalMinutes` to the GCS customTime
146
- * and re-mint the advertisement token on-chain.
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 renewFile(uhrpUrl, additionalMinutes) {
154
- const url = `${this.baseURL}/renew`;
155
- const body = { uhrpUrl, additionalMinutes };
156
- const response = await this.authFetch.fetch(url, {
157
- method: 'POST',
158
- headers: { 'Content-Type': 'application/json' },
159
- body: JSON.stringify(body)
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(`renewFile request failed: HTTP ${response.status}`);
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(`renewFile returned an error: ${errCode} - ${errDesc}`);
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: data.status,
172
- prevExpiryTime: data.prevExpiryTime,
173
- newExpiryTime: data.newExpiryTime,
174
- amount: data.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;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,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"}