@bsv/sdk 2.0.13 → 2.0.15
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 +14 -14
- 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/primitives/Hash.js +1 -1
- package/dist/cjs/src/primitives/Hash.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +10 -3
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/script/Script.js +60 -13
- package/dist/cjs/src/script/Script.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +434 -59
- package/dist/cjs/src/script/Spend.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/http/BinaryFetchClient.js +6 -2
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js +8 -4
- package/dist/cjs/src/transaction/http/DefaultHttpClient.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/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/primitives/Hash.js +1 -1
- package/dist/esm/src/primitives/Hash.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +10 -3
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/script/Script.js +60 -13
- package/dist/esm/src/script/Script.js.map +1 -1
- package/dist/esm/src/script/Spend.js +438 -59
- package/dist/esm/src/script/Spend.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/http/BinaryFetchClient.js +6 -2
- package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js +8 -4
- package/dist/esm/src/transaction/http/DefaultHttpClient.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/primitives/TransactionSignature.d.ts +1 -0
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
- package/dist/types/src/script/Script.d.ts +1 -0
- package/dist/types/src/script/Script.d.ts.map +1 -1
- package/dist/types/src/script/ScriptChunk.d.ts +1 -0
- package/dist/types/src/script/ScriptChunk.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts +29 -0
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- 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/http/BinaryFetchClient.d.ts.map +1 -1
- package/dist/types/src/transaction/http/DefaultHttpClient.d.ts +2 -2
- package/dist/types/src/transaction/http/DefaultHttpClient.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 -5
- package/docs/index.md +3 -1
- package/docs/reference/identity.md +1 -1
- package/docs/reference/primitives.md +1 -0
- package/docs/reference/script.md +7 -0
- package/docs/reference/storage.md +214 -85
- package/docs/reference/transaction.md +4 -4
- package/docs/reference/wallet.md +4 -4
- package/package.json +14 -14
- package/src/identity/IdentityClient.ts +3 -3
- package/src/identity/__tests/IdentityClient.additional.test.ts +3 -3
- package/src/identity/types/index.ts +1 -1
- package/src/primitives/Hash.ts +1 -1
- package/src/primitives/TransactionSignature.ts +11 -3
- package/src/script/Script.ts +59 -13
- package/src/script/ScriptChunk.ts +1 -0
- package/src/script/Spend.ts +483 -61
- package/src/script/__tests/NormativeVectors.test.ts +465 -0
- package/src/script/__tests/fixtures/SOURCES.md +25 -0
- package/src/script/__tests/fixtures/bitcoin-sv/script_tests.json +2591 -0
- package/src/script/__tests/fixtures/bitcoin-sv/sighash.json +1003 -0
- package/src/script/__tests/fixtures/bitcoin-sv/tx_invalid.json +285 -0
- package/src/script/__tests/fixtures/bitcoin-sv/tx_valid.json +367 -0
- package/src/script/__tests/fixtures/teranode/script_tests.json +2432 -0
- package/src/script/__tests/fixtures/teranode/sighash.json +1003 -0
- package/src/script/__tests/fixtures/teranode/tx_invalid.json +285 -0
- package/src/script/__tests/fixtures/teranode/tx_valid.json +367 -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/broadcasters/__tests/ARC.test.ts +26 -4
- package/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.ts +26 -4
- package/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.ts +32 -10
- package/src/transaction/http/BinaryFetchClient.ts +5 -2
- package/src/transaction/http/DefaultHttpClient.ts +7 -4
- package/src/transaction/http/__tests/DefaultHttpClient.additional.test.ts +19 -1
- package/src/wallet/WERR_REVIEW_ACTIONS.ts +2 -2
- package/src/wallet/Wallet.interfaces.ts +2 -2
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js +0 -827
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +0 -1
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.test.js +0 -266
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.test.js.map +0 -1
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +0 -654
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +0 -1
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js +0 -144
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +0 -1
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js +0 -825
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +0 -1
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.test.js +0 -264
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.test.js.map +0 -1
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +0 -619
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +0 -1
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js +0 -109
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +0 -1
- package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts +0 -21
- package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts.map +0 -1
- package/dist/types/src/auth/clients/__tests__/AuthFetch.test.d.ts +0 -2
- package/dist/types/src/auth/clients/__tests__/AuthFetch.test.d.ts.map +0 -1
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts +0 -2
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts.map +0 -1
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.test.d.ts +0 -2
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.test.d.ts.map +0 -1
- package/dist/umd/bundle.js.map +0 -1
|
@@ -33,40 +33,84 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.StorageUploader = void 0;
|
|
36
|
+
exports.StorageUploader = exports.RenewResiliencyError = exports.DEFAULT_UHRP_SERVERS = void 0;
|
|
37
37
|
const AuthFetch_js_1 = require("../auth/clients/AuthFetch.js");
|
|
38
38
|
const StorageUtils = __importStar(require("./StorageUtils.js"));
|
|
39
|
+
/** Default UHRP storage providers used when the caller passes no host list. */
|
|
40
|
+
exports.DEFAULT_UHRP_SERVERS = [
|
|
41
|
+
'https://nanostore.babbage.systems',
|
|
42
|
+
'https://bsv-storage-cloudflare.dev-a3e.workers.dev'
|
|
43
|
+
];
|
|
39
44
|
/**
|
|
40
|
-
*
|
|
41
|
-
* -
|
|
42
|
-
*
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
* Thrown by `renewFile` when successful renewals fall below the resilience
|
|
46
|
+
* threshold. Per-host outcomes are attached so callers can reconcile which
|
|
47
|
+
* providers were billed.
|
|
48
|
+
*/
|
|
49
|
+
class RenewResiliencyError extends Error {
|
|
50
|
+
constructor(message, results, requiredSuccesses, successCount) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = 'RenewResiliencyError';
|
|
53
|
+
this.results = results;
|
|
54
|
+
this.requiredSuccesses = requiredSuccesses;
|
|
55
|
+
this.successCount = successCount;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.RenewResiliencyError = RenewResiliencyError;
|
|
59
|
+
/**
|
|
60
|
+
* Client for publishing, finding, listing, and renewing UHRP-hosted files
|
|
61
|
+
* across one or more storage providers.
|
|
45
62
|
*/
|
|
46
63
|
class StorageUploader {
|
|
47
|
-
/**
|
|
48
|
-
* Creates a new StorageUploader instance.
|
|
49
|
-
* @param {UploaderConfig} config - An object containing the storage server's URL and a wallet interface
|
|
50
|
-
*/
|
|
51
64
|
constructor(config) {
|
|
52
|
-
|
|
65
|
+
const legacySingleHost = config.storageURLs === undefined && typeof config.storageURL === 'string';
|
|
66
|
+
let hosts;
|
|
67
|
+
if (config.storageURLs !== undefined) {
|
|
68
|
+
if (config.storageURLs.length === 0) {
|
|
69
|
+
throw new Error('StorageUploader requires at least one storage provider.');
|
|
70
|
+
}
|
|
71
|
+
hosts = [...config.storageURLs];
|
|
72
|
+
}
|
|
73
|
+
else if (typeof config.storageURL === 'string') {
|
|
74
|
+
hosts = [config.storageURL];
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
hosts = [...exports.DEFAULT_UHRP_SERVERS];
|
|
78
|
+
}
|
|
79
|
+
const requestedLevel = config.resilienceLevel ?? 1;
|
|
80
|
+
if (!Number.isInteger(requestedLevel) || requestedLevel < 1) {
|
|
81
|
+
throw new Error('resilienceLevel must be a positive integer.');
|
|
82
|
+
}
|
|
83
|
+
// Legacy `storageURL` callers must not start demanding extra replicas.
|
|
84
|
+
this.resilienceLevel = legacySingleHost ? 1 : requestedLevel;
|
|
85
|
+
this.hosts = hosts;
|
|
86
|
+
this.baseURL = hosts[0];
|
|
53
87
|
this.authFetch = new AuthFetch_js_1.AuthFetch(config.wallet);
|
|
54
88
|
}
|
|
55
|
-
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
89
|
+
/** Returns `null` when the provider is unreachable or errors out. */
|
|
90
|
+
async getQuote(host, fileSize, retentionPeriod) {
|
|
91
|
+
try {
|
|
92
|
+
const response = await fetch(`${host}/quote`, {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: { 'Content-Type': 'application/json' },
|
|
95
|
+
body: JSON.stringify({ fileSize, retentionPeriod })
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok)
|
|
98
|
+
return null;
|
|
99
|
+
const data = await response.json();
|
|
100
|
+
if (data.status === 'error' || typeof data.quote !== 'number')
|
|
101
|
+
return null;
|
|
102
|
+
return { host, amount: data.quote };
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Drives the authenticated `/upload` route; `AuthFetch` handles the 402 payment flow. */
|
|
109
|
+
async getUploadURL(host, fileSize, retentionPeriod) {
|
|
110
|
+
const response = await this.authFetch.fetch(`${host}/upload`, {
|
|
67
111
|
method: 'POST',
|
|
68
112
|
headers: { 'Content-Type': 'application/json' },
|
|
69
|
-
body: JSON.stringify(
|
|
113
|
+
body: JSON.stringify({ fileSize, retentionPeriod })
|
|
70
114
|
});
|
|
71
115
|
if (!response.ok) {
|
|
72
116
|
throw new Error(`Upload info request failed: HTTP ${response.status}`);
|
|
@@ -81,63 +125,101 @@ class StorageUploader {
|
|
|
81
125
|
amount: data.amount
|
|
82
126
|
};
|
|
83
127
|
}
|
|
84
|
-
|
|
85
|
-
* Performs the actual file upload (HTTP PUT) to the presigned URL returned by the server.
|
|
86
|
-
* @private
|
|
87
|
-
* @param {string} uploadURL - The presigned URL where the file is to be uploaded
|
|
88
|
-
* @param {UploadableFile} file - The file to upload, including its raw data and MIME type
|
|
89
|
-
* @param {Record<string, string>} requiredHeaders - Additional headers required by the server (e.g. content-length)
|
|
90
|
-
* @returns {Promise<UploadFileResult>} An object indicating whether publishing was successful and the resulting UHRP URL
|
|
91
|
-
* @throws {Error} If the server returns a non-OK response
|
|
92
|
-
*/
|
|
93
|
-
async uploadFile(uploadURL, file, requiredHeaders) {
|
|
94
|
-
const body = file.data instanceof Uint8Array ? file.data : Uint8Array.from(file.data);
|
|
128
|
+
async putFile(uploadURL, data, contentType, requiredHeaders) {
|
|
95
129
|
const response = await fetch(uploadURL, {
|
|
96
130
|
method: 'PUT',
|
|
97
|
-
body:
|
|
131
|
+
body: data,
|
|
98
132
|
headers: {
|
|
99
|
-
'Content-Type':
|
|
133
|
+
'Content-Type': contentType,
|
|
100
134
|
...requiredHeaders
|
|
101
135
|
}
|
|
102
136
|
});
|
|
103
137
|
if (!response.ok) {
|
|
104
138
|
throw new Error(`File upload failed: HTTP ${response.status}`);
|
|
105
139
|
}
|
|
106
|
-
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Collects quotes in parallel batches, shrinking each batch to only the
|
|
143
|
+
* remaining quotes still needed so we never over-query once the quote
|
|
144
|
+
* budget is satisfied.
|
|
145
|
+
*/
|
|
146
|
+
async collectQuotes(fileSize, retentionPeriod, maxNeeded) {
|
|
147
|
+
const quotes = [];
|
|
148
|
+
let index = 0;
|
|
149
|
+
while (index < this.hosts.length && quotes.length < maxNeeded) {
|
|
150
|
+
const remaining = maxNeeded - quotes.length;
|
|
151
|
+
const batch = this.hosts.slice(index, index + remaining);
|
|
152
|
+
index += batch.length;
|
|
153
|
+
const results = await Promise.all(batch.map(async (host) => await this.getQuote(host, fileSize, retentionPeriod)));
|
|
154
|
+
for (const quote of results) {
|
|
155
|
+
if (quote !== null && quotes.length < maxNeeded) {
|
|
156
|
+
quotes.push(quote);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return quotes;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Queries the unauthenticated `/quote` endpoint on up to `2 * resilienceLevel`
|
|
164
|
+
* providers and returns the cheapest-first quote list plus the aggregate
|
|
165
|
+
* cost `publishFile` would pay. No provider is billed.
|
|
166
|
+
*/
|
|
167
|
+
async estimateCost(params) {
|
|
168
|
+
const { fileSize, retentionPeriod } = params;
|
|
169
|
+
const quotes = await this.collectQuotes(fileSize, retentionPeriod, this.resilienceLevel * 2);
|
|
170
|
+
quotes.sort((a, b) => a.amount - b.amount);
|
|
171
|
+
const meetsResilienceThreshold = quotes.length >= this.resilienceLevel;
|
|
172
|
+
const budget = meetsResilienceThreshold ? quotes.slice(0, this.resilienceLevel) : quotes;
|
|
173
|
+
const totalForResilience = budget.reduce((sum, q) => sum + q.amount, 0);
|
|
107
174
|
return {
|
|
108
|
-
|
|
109
|
-
|
|
175
|
+
quotes: quotes.map(q => ({ host: q.host, amount: q.amount })),
|
|
176
|
+
resilienceLevel: this.resilienceLevel,
|
|
177
|
+
totalForResilience,
|
|
178
|
+
meetsResilienceThreshold
|
|
110
179
|
};
|
|
111
180
|
}
|
|
112
181
|
/**
|
|
113
|
-
* Publishes a file
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* 1. Request an upload URL from the server.
|
|
117
|
-
* 2. Perform an HTTP PUT to upload the file’s raw bytes.
|
|
118
|
-
* 3. Return a UHRP URL referencing the file once published.
|
|
119
|
-
*
|
|
120
|
-
* @param {Object} params
|
|
121
|
-
* @param {UploadableFile} params.file - The file data + type
|
|
122
|
-
* @param {number} params.retentionPeriod - Number of minutes to host the file
|
|
123
|
-
* @returns {Promise<UploadFileResult>} An object with the file's UHRP URL
|
|
124
|
-
* @throws {Error} If the server or upload step returns a non-OK response
|
|
182
|
+
* Publishes a file across the cheapest configured providers, falling
|
|
183
|
+
* through to the next-cheapest quote if a paid upload fails. Throws when
|
|
184
|
+
* the resilience threshold cannot be met.
|
|
125
185
|
*/
|
|
126
186
|
async publishFile(params) {
|
|
127
187
|
const { file, retentionPeriod } = params;
|
|
128
188
|
const data = file.data instanceof Uint8Array ? file.data : Uint8Array.from(file.data);
|
|
129
189
|
const fileSize = data.byteLength;
|
|
130
|
-
const
|
|
131
|
-
|
|
190
|
+
const estimate = await this.estimateCost({ fileSize, retentionPeriod });
|
|
191
|
+
if (!estimate.meetsResilienceThreshold) {
|
|
192
|
+
throw new Error(`Resiliency threshold of ${this.resilienceLevel} could not be met: ` +
|
|
193
|
+
`only ${estimate.quotes.length} of ${this.hosts.length} provider(s) responded with quotes.`);
|
|
194
|
+
}
|
|
195
|
+
const uhrpURL = StorageUtils.getURLForFile(data);
|
|
196
|
+
const hostedBy = [];
|
|
197
|
+
const failures = [];
|
|
198
|
+
for (const quote of estimate.quotes) {
|
|
199
|
+
if (hostedBy.length >= this.resilienceLevel)
|
|
200
|
+
break;
|
|
201
|
+
try {
|
|
202
|
+
const { uploadURL, requiredHeaders } = await this.getUploadURL(quote.host, fileSize, retentionPeriod);
|
|
203
|
+
await this.putFile(uploadURL, data, file.type, requiredHeaders);
|
|
204
|
+
hostedBy.push(quote.host);
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
failures.push({ host: quote.host, error: e.message });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (hostedBy.length < this.resilienceLevel) {
|
|
211
|
+
const detail = failures.map(f => `${f.host}: ${f.error}`).join('; ');
|
|
212
|
+
throw new Error(`Resiliency threshold of ${this.resilienceLevel} could not be met: ` +
|
|
213
|
+
`only ${hostedBy.length} upload(s) succeeded. Failures — ${detail}`);
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
published: true,
|
|
217
|
+
uhrpURL,
|
|
218
|
+
hostedBy
|
|
219
|
+
};
|
|
132
220
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* @param {string} uhrpUrl - The UHRP URL, e.g. "uhrp://abcd..."
|
|
136
|
-
* @returns {Promise<FindFileData>} An object with file name, size, MIME type, and expiry time
|
|
137
|
-
* @throws {Error} If the server or the route returns an error
|
|
138
|
-
*/
|
|
139
|
-
async findFile(uhrpUrl) {
|
|
140
|
-
const url = new URL(`${this.baseURL}/find`);
|
|
221
|
+
async findFileAtHost(host, uhrpUrl) {
|
|
222
|
+
const url = new URL(`${host}/find`);
|
|
141
223
|
url.searchParams.set('uhrpUrl', uhrpUrl);
|
|
142
224
|
const response = await this.authFetch.fetch(url.toString(), {
|
|
143
225
|
method: 'GET'
|
|
@@ -153,59 +235,196 @@ class StorageUploader {
|
|
|
153
235
|
}
|
|
154
236
|
return data.data;
|
|
155
237
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
async listUploads() {
|
|
162
|
-
const url = `${this.baseURL}/list`;
|
|
163
|
-
const response = await this.authFetch.fetch(url, {
|
|
164
|
-
method: 'GET'
|
|
238
|
+
async renewFileAtHost(host, uhrpUrl, additionalMinutes) {
|
|
239
|
+
const response = await this.authFetch.fetch(`${host}/renew`, {
|
|
240
|
+
method: 'POST',
|
|
241
|
+
headers: { 'Content-Type': 'application/json' },
|
|
242
|
+
body: JSON.stringify({ uhrpUrl, additionalMinutes })
|
|
165
243
|
});
|
|
166
244
|
if (!response.ok) {
|
|
167
|
-
throw new Error(`
|
|
245
|
+
throw new Error(`renewFile request failed: HTTP ${response.status}`);
|
|
168
246
|
}
|
|
169
247
|
const data = await response.json();
|
|
170
248
|
if (data.status === 'error') {
|
|
171
249
|
const errCode = data.code ?? 'unknown-code';
|
|
172
250
|
const errDesc = data.description ?? 'no-description';
|
|
173
|
-
throw new Error(`
|
|
251
|
+
throw new Error(`renewFile returned an error: ${errCode} - ${errDesc}`);
|
|
174
252
|
}
|
|
175
|
-
return
|
|
253
|
+
return {
|
|
254
|
+
status: data.status,
|
|
255
|
+
prevExpiryTime: data.prevExpiryTime,
|
|
256
|
+
newExpiryTime: data.newExpiryTime,
|
|
257
|
+
amount: data.amount
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** Intersects `hostedBy` with the configured host set; throws when empty. */
|
|
261
|
+
resolveTargets(hostedBy) {
|
|
262
|
+
if (hostedBy === undefined)
|
|
263
|
+
return this.hosts;
|
|
264
|
+
const configured = new Set(this.hosts);
|
|
265
|
+
const intersection = hostedBy.filter(h => configured.has(h));
|
|
266
|
+
if (intersection.length === 0) {
|
|
267
|
+
throw new Error('hostedBy did not intersect any configured provider. ' +
|
|
268
|
+
'Provide hosts that were also passed to the StorageUploader constructor.');
|
|
269
|
+
}
|
|
270
|
+
return intersection;
|
|
176
271
|
}
|
|
177
272
|
/**
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* @param {string} uhrpUrl - The UHRP URL of the file (e.g., "uhrp://abcd1234...")
|
|
183
|
-
* @param {number} additionalMinutes - The number of minutes to extend
|
|
184
|
-
* @returns {Promise<RenewFileResult>} An object with the new and previous expiry times, plus any cost
|
|
185
|
-
* @throws {Error} If the request fails or the server returns an error
|
|
273
|
+
* Fans `/find` out across configured hosts (UHRP storage is host-local,
|
|
274
|
+
* so any one host may not know the file) and returns the record with the
|
|
275
|
+
* longest remaining expiry. Single-host configurations preserve the
|
|
276
|
+
* legacy error-message contract verbatim.
|
|
186
277
|
*/
|
|
187
|
-
async
|
|
188
|
-
const
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
278
|
+
async findFile(uhrpUrl, options = {}) {
|
|
279
|
+
const targets = this.resolveTargets(options.hostedBy);
|
|
280
|
+
const outcomes = await Promise.all(targets.map(async (host) => {
|
|
281
|
+
try {
|
|
282
|
+
return { ok: true, host, data: await this.findFileAtHost(host, uhrpUrl) };
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
return { ok: false, host, error: e };
|
|
286
|
+
}
|
|
287
|
+
}));
|
|
288
|
+
const successes = outcomes.flatMap(o => o.ok ? [o] : []);
|
|
289
|
+
if (successes.length === 0) {
|
|
290
|
+
const failures = outcomes.flatMap(o => o.ok ? [] : [o]);
|
|
291
|
+
if (targets.length === 1)
|
|
292
|
+
throw failures[0].error;
|
|
293
|
+
const detail = failures.map(f => `${f.host}: ${f.error.message}`).join('; ');
|
|
294
|
+
throw new Error(`findFile: no configured host reported this UHRP URL — ${detail}`);
|
|
295
|
+
}
|
|
296
|
+
successes.sort((a, b) => b.data.expiryTime - a.data.expiryTime);
|
|
297
|
+
const best = successes[0];
|
|
298
|
+
if (targets.length === 1) {
|
|
299
|
+
return best.data;
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
...best.data,
|
|
303
|
+
hostedBy: successes.map(s => s.host)
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Unions `/list` output across configured hosts, merging duplicate UHRP
|
|
308
|
+
* URLs by the longest expiry observed. One failing host does not hide
|
|
309
|
+
* the rest. Single-host configurations preserve the legacy error contract.
|
|
310
|
+
*/
|
|
311
|
+
async listUploads(options = {}) {
|
|
312
|
+
const targets = this.resolveTargets(options.hostedBy);
|
|
313
|
+
const outcomes = await Promise.all(targets.map(async (host) => {
|
|
314
|
+
try {
|
|
315
|
+
return { ok: true, host, data: await this.listUploadsAtHost(host) };
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
return { ok: false, host, error: e };
|
|
319
|
+
}
|
|
320
|
+
}));
|
|
321
|
+
const successes = outcomes.flatMap(o => o.ok ? [o] : []);
|
|
322
|
+
if (successes.length === 0) {
|
|
323
|
+
const failures = outcomes.flatMap(o => o.ok ? [] : [o]);
|
|
324
|
+
if (targets.length === 1)
|
|
325
|
+
throw failures[0].error;
|
|
326
|
+
const detail = failures.map(f => `${f.host}: ${f.error.message}`).join('; ');
|
|
327
|
+
throw new Error(`listUploads: no configured host returned a listing — ${detail}`);
|
|
328
|
+
}
|
|
329
|
+
if (targets.length === 1) {
|
|
330
|
+
return successes[0].data;
|
|
331
|
+
}
|
|
332
|
+
const merged = new Map();
|
|
333
|
+
for (const { host, data } of successes) {
|
|
334
|
+
if (!Array.isArray(data))
|
|
335
|
+
continue;
|
|
336
|
+
for (const entry of data) {
|
|
337
|
+
const key = entry?.uhrpUrl;
|
|
338
|
+
if (typeof key !== 'string')
|
|
339
|
+
continue;
|
|
340
|
+
const rawExpiry = Number(entry.expiryTime);
|
|
341
|
+
const expiry = Number.isFinite(rawExpiry) ? rawExpiry : 0;
|
|
342
|
+
const existing = merged.get(key);
|
|
343
|
+
if (existing === undefined) {
|
|
344
|
+
merged.set(key, { uhrpUrl: key, expiryTime: expiry, hostedBy: [host] });
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
existing.expiryTime = Math.max(existing.expiryTime, expiry);
|
|
348
|
+
if (!existing.hostedBy.includes(host))
|
|
349
|
+
existing.hostedBy.push(host);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return Array.from(merged.values());
|
|
354
|
+
}
|
|
355
|
+
async listUploadsAtHost(host) {
|
|
356
|
+
const response = await this.authFetch.fetch(`${host}/list`, { method: 'GET' });
|
|
195
357
|
if (!response.ok) {
|
|
196
|
-
throw new Error(`
|
|
358
|
+
throw new Error(`listUploads request failed: HTTP ${response.status}`);
|
|
197
359
|
}
|
|
198
360
|
const data = await response.json();
|
|
199
361
|
if (data.status === 'error') {
|
|
200
362
|
const errCode = data.code ?? 'unknown-code';
|
|
201
363
|
const errDesc = data.description ?? 'no-description';
|
|
202
|
-
throw new Error(`
|
|
364
|
+
throw new Error(`listUploads returned an error: ${errCode} - ${errDesc}`);
|
|
365
|
+
}
|
|
366
|
+
return data.uploads;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Fans `/renew` out across every configured host (each provider owns its
|
|
370
|
+
* own advertisement, so a single-host renewal would degrade resilience
|
|
371
|
+
* over time). Hosts that do not carry the file are not billed. Throws
|
|
372
|
+
* {@link RenewResiliencyError} when successful renewals fall below the
|
|
373
|
+
* resilience threshold.
|
|
374
|
+
*/
|
|
375
|
+
async renewFile(uhrpUrl, additionalMinutes, options = {}) {
|
|
376
|
+
const targets = this.resolveTargets(options.hostedBy);
|
|
377
|
+
// Single-host: pass the server's error through unchanged for legacy callers.
|
|
378
|
+
if (targets.length === 1) {
|
|
379
|
+
const data = await this.renewFileAtHost(targets[0], uhrpUrl, additionalMinutes);
|
|
380
|
+
return {
|
|
381
|
+
status: data.status,
|
|
382
|
+
prevExpiryTime: data.prevExpiryTime,
|
|
383
|
+
newExpiryTime: data.newExpiryTime,
|
|
384
|
+
amount: data.amount
|
|
385
|
+
};
|
|
203
386
|
}
|
|
387
|
+
const perHost = await Promise.all(targets.map(async (host) => {
|
|
388
|
+
try {
|
|
389
|
+
const data = await this.renewFileAtHost(host, uhrpUrl, additionalMinutes);
|
|
390
|
+
return {
|
|
391
|
+
result: {
|
|
392
|
+
host,
|
|
393
|
+
status: 'success',
|
|
394
|
+
prevExpiryTime: data.prevExpiryTime,
|
|
395
|
+
newExpiryTime: data.newExpiryTime,
|
|
396
|
+
amount: data.amount
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
const err = e;
|
|
402
|
+
return {
|
|
403
|
+
result: { host, status: 'error', error: err.message },
|
|
404
|
+
raw: err
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
}));
|
|
408
|
+
const outcomes = perHost.map(p => p.result);
|
|
409
|
+
const successes = outcomes.filter(o => o.status === 'success');
|
|
410
|
+
// Clamp to targets.length so an explicit `hostedBy` smaller than the
|
|
411
|
+
// configured resilience level doesn't trigger an impossible threshold.
|
|
412
|
+
const requiredSuccesses = Math.min(targets.length, this.resilienceLevel);
|
|
413
|
+
if (successes.length < requiredSuccesses) {
|
|
414
|
+
const detail = outcomes
|
|
415
|
+
.map(o => `${o.host}: ${o.status === 'success' ? 'renewed' : (o.error ?? 'unknown')}`)
|
|
416
|
+
.join('; ');
|
|
417
|
+
throw new RenewResiliencyError(`renewFile: only ${successes.length} of ${requiredSuccesses} required hosts renewed — ${detail}`, outcomes, requiredSuccesses, successes.length);
|
|
418
|
+
}
|
|
419
|
+
successes.sort((a, b) => (b.newExpiryTime ?? 0) - (a.newExpiryTime ?? 0));
|
|
420
|
+
const primary = successes[0];
|
|
421
|
+
const totalAmount = successes.reduce((sum, s) => sum + (s.amount ?? 0), 0);
|
|
204
422
|
return {
|
|
205
|
-
status:
|
|
206
|
-
prevExpiryTime:
|
|
207
|
-
newExpiryTime:
|
|
208
|
-
amount:
|
|
423
|
+
status: 'success',
|
|
424
|
+
prevExpiryTime: primary.prevExpiryTime,
|
|
425
|
+
newExpiryTime: primary.newExpiryTime,
|
|
426
|
+
amount: totalAmount,
|
|
427
|
+
results: outcomes
|
|
209
428
|
};
|
|
210
429
|
}
|
|
211
430
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageUploader.js","sourceRoot":"","sources":["../../../../src/storage/StorageUploader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAAwD;AAExD,gEAAiD;AA+BjD;;;;;;GAMG;AACH,MAAa,eAAe;IAI1B;;;OAGG;IACH,YAAa,MAAsB;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAA;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,aAAa,CACzB,QAAgB,EAChB,eAAuB;QAMvB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,SAAS,CAAA;QACpC,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAA;QAE1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAK/B,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QACD,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,UAAU,CACtB,SAAiB,EACjB,IAAoB,EACpB,eAAuC;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAgB;YACtB,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI,CAAC,IAAI;gBACzB,GAAG,eAAe;aACnB;SACF,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAChE,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO;SACR,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,KAAK,CAAC,WAAW,CAAE,MAGzB;QACC,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,CAAA;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAA;QAEhC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;QAC1F,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,CAAA;IACrF,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,QAAQ,CAAE,OAAe;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,OAAO,CAAC,CAAA;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAExC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC1D,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAK/B,CAAA;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,CAAA;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAA;YACpD,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,MAAM,OAAO,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,WAAW;QACtB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,OAAO,CAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/C,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAc,IAAI,cAAc,CAAA;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAqB,IAAI,gBAAgB,CAAA;YAC9D,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,MAAM,OAAO,EAAE,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,SAAS,CAAE,OAAe,EAAE,iBAAyB;QAChE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,QAAQ,CAAA;QACnC,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAA;QAE3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAO/B,CAAA;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,CAAA;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAA;YACpD,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,MAAM,OAAO,EAAE,CAAC,CAAA;QACzE,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;CACF;AAzND,0CAyNC"}
|
|
1
|
+
{"version":3,"file":"StorageUploader.js","sourceRoot":"","sources":["../../../../src/storage/StorageUploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,10 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.StorageDownloader = exports.StorageUploader = exports.StorageUtils = void 0;
|
|
36
|
+
exports.StorageDownloader = exports.RenewResiliencyError = exports.DEFAULT_UHRP_SERVERS = exports.StorageUploader = exports.StorageUtils = void 0;
|
|
37
37
|
exports.StorageUtils = __importStar(require("./StorageUtils.js"));
|
|
38
38
|
var StorageUploader_js_1 = require("./StorageUploader.js");
|
|
39
39
|
Object.defineProperty(exports, "StorageUploader", { enumerable: true, get: function () { return StorageUploader_js_1.StorageUploader; } });
|
|
40
|
+
Object.defineProperty(exports, "DEFAULT_UHRP_SERVERS", { enumerable: true, get: function () { return StorageUploader_js_1.DEFAULT_UHRP_SERVERS; } });
|
|
41
|
+
Object.defineProperty(exports, "RenewResiliencyError", { enumerable: true, get: function () { return StorageUploader_js_1.RenewResiliencyError; } });
|
|
40
42
|
var StorageDownloader_js_1 = require("./StorageDownloader.js");
|
|
41
43
|
Object.defineProperty(exports, "StorageDownloader", { enumerable: true, get: function () { return StorageDownloader_js_1.StorageDownloader; } });
|
|
42
44
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kEAAiD;AAEjD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kEAAiD;AAEjD,2DAAkG;AAAzF,qHAAA,eAAe,OAAA;AAAE,0HAAA,oBAAoB,OAAA;AAAE,0HAAA,oBAAoB,OAAA;AAEpE,+DAA0D;AAAjD,yHAAA,iBAAiB,OAAA"}
|
|
@@ -46,11 +46,15 @@ function binaryHttpClient() {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
if (typeof window !== 'undefined' && typeof window.fetch === 'function') {
|
|
49
|
-
//
|
|
49
|
+
// Browser tab/page context
|
|
50
50
|
return new BinaryFetchClient(window.fetch.bind(window));
|
|
51
51
|
}
|
|
52
|
+
else if (typeof globalThis.fetch === 'function') {
|
|
53
|
+
// Service workers, Deno, Node 18+ (any environment with global fetch)
|
|
54
|
+
return new BinaryFetchClient(globalThis.fetch.bind(globalThis));
|
|
55
|
+
}
|
|
52
56
|
else if (typeof require !== 'undefined') {
|
|
53
|
-
//
|
|
57
|
+
// Older Node.js — use https module
|
|
54
58
|
// eslint-disable-next-line
|
|
55
59
|
try {
|
|
56
60
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryFetchClient.js","sourceRoot":"","sources":["../../../../../src/transaction/http/BinaryFetchClient.ts"],"names":[],"mappings":";;;AA6FA,
|
|
1
|
+
{"version":3,"file":"BinaryFetchClient.js","sourceRoot":"","sources":["../../../../../src/transaction/http/BinaryFetchClient.ts"],"names":[],"mappings":";;;AA6FA,4CA0BC;AAlHD,2EAAmF;AAoBnF;;GAEG;AACH,MAAa,sBAAsB;IACjC,YAA6B,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IAAI,CAAC;IAE1D,KAAK,CAAC,OAAO,CACX,GAAW,EACX,cAAwC;QAExC,OAAO,MAAM,IAAA,gDAAoB,EAC/B,IAAI,CAAC,KAAmC,EACxC,GAAG,EACH,cAAc,EACd,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5B,CAAA;IACH,CAAC;CACF;AAdD,wDAcC;AAuBD;;GAEG;AACH,MAAa,iBAAiB;IAC5B,YAA6B,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAI,CAAC;IAE9C,KAAK,CAAC,OAAO,CACX,GAAW,EACX,OAAiC;QAEjC,MAAM,YAAY,GAAiB;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAE7B,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,IAAI,EAAE,IAAS;SAChB,CAAA;IACH,CAAC;CACF;AAvBD,8CAuBC;AAED,SAAgB,gBAAgB;IAC9B,MAAM,YAAY,GAAe;QAC/B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAChE,CAAC;KACF,CAAA;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACxE,2BAA2B;QAC3B,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAClD,sEAAsE;QACtE,OAAO,IAAI,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACjE,CAAC;SAAM,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QAC1C,mCAAmC;QACnC,2BAA2B;QAC3B,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9B,OAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,YAAY,CAAA;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -5,8 +5,8 @@ const NodejsHttpClient_js_1 = require("./NodejsHttpClient.js");
|
|
|
5
5
|
const FetchHttpClient_js_1 = require("./FetchHttpClient.js");
|
|
6
6
|
/**
|
|
7
7
|
* Returns a default HttpClient implementation based on the environment that it is run on.
|
|
8
|
-
* This method will attempt to use `window.fetch` if available (in browser environments)
|
|
9
|
-
*
|
|
8
|
+
* This method will attempt to use `window.fetch` if available (in browser environments),
|
|
9
|
+
* then `globalThis.fetch` (service workers, Deno, Node 18+), then the Node `https` module.
|
|
10
10
|
*/
|
|
11
11
|
function defaultHttpClient() {
|
|
12
12
|
const noHttpClient = {
|
|
@@ -15,11 +15,15 @@ function defaultHttpClient() {
|
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
if (typeof window !== 'undefined' && typeof window.fetch === 'function') {
|
|
18
|
-
//
|
|
18
|
+
// Browser tab/page context
|
|
19
19
|
return new FetchHttpClient_js_1.FetchHttpClient(window.fetch.bind(window));
|
|
20
20
|
}
|
|
21
|
+
else if (typeof globalThis.fetch === 'function') {
|
|
22
|
+
// Service workers, Deno, Node 18+ (any environment with global fetch)
|
|
23
|
+
return new FetchHttpClient_js_1.FetchHttpClient(globalThis.fetch.bind(globalThis));
|
|
24
|
+
}
|
|
21
25
|
else if (typeof require !== 'undefined') {
|
|
22
|
-
//
|
|
26
|
+
// Older Node.js — use https module
|
|
23
27
|
// eslint-disable-next-line
|
|
24
28
|
try {
|
|
25
29
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultHttpClient.js","sourceRoot":"","sources":["../../../../../src/transaction/http/DefaultHttpClient.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"DefaultHttpClient.js","sourceRoot":"","sources":["../../../../../src/transaction/http/DefaultHttpClient.ts"],"names":[],"mappings":";;AASA,8CA0BC;AAlCD,+DAAwD;AACxD,6DAAsD;AAEtD;;;;GAIG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,YAAY,GAAe;QAC/B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAChE,CAAC;KACF,CAAA;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACxE,2BAA2B;QAC3B,OAAO,IAAI,oCAAe,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACvD,CAAC;SAAM,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAClD,sEAAsE;QACtE,OAAO,IAAI,oCAAe,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IAC/D,CAAC;SAAM,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QAC1C,mCAAmC;QACnC,2BAA2B;QAC3B,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9B,OAAO,IAAI,sCAAgB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,YAAY,CAAA;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WERR_REVIEW_ACTIONS = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* When a `createAction` or `signAction` is completed in undelayed mode (`acceptDelayedBroadcast`: false),
|
|
6
|
-
* any
|
|
6
|
+
* any unsuccessful result will return the results by way of this exception to ensure attention is
|
|
7
7
|
* paid to processing errors.
|
|
8
8
|
*/
|
|
9
9
|
class WERR_REVIEW_ACTIONS extends Error {
|
|
10
10
|
/**
|
|
11
|
-
* All parameters correspond to their comparable `createAction` or `
|
|
11
|
+
* All parameters correspond to their comparable `createAction` or `signAction` results
|
|
12
12
|
* with the exception of `reviewActionResults`;
|
|
13
13
|
* which contains more details, particularly for double spend results.
|
|
14
14
|
*/
|