@uploadcare/upload-client 6.0.1-alpha.0 → 6.0.1-alpha.10
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/dist/index.browser.js +185 -126
- package/dist/index.d.ts +62 -55
- package/dist/index.node.js +186 -127
- package/dist/index.react-native.js +220 -148
- package/package.json +1 -1
package/dist/index.browser.js
CHANGED
|
@@ -157,6 +157,26 @@ const poll = ({ check, interval = DEFAULT_INTERVAL, timeout, signal }) => new Pr
|
|
|
157
157
|
tickTimeoutId = setTimeout(tick, 0);
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
+
/*
|
|
161
|
+
Settings for future support:
|
|
162
|
+
parallelDirectUploads: 10,
|
|
163
|
+
*/
|
|
164
|
+
const defaultSettings = {
|
|
165
|
+
baseCDN: 'https://ucarecdn.com',
|
|
166
|
+
baseURL: 'https://upload.uploadcare.com',
|
|
167
|
+
maxContentLength: 50 * 1024 * 1024,
|
|
168
|
+
retryThrottledRequestMaxTimes: 1,
|
|
169
|
+
retryNetworkErrorMaxTimes: 3,
|
|
170
|
+
multipartMinFileSize: 25 * 1024 * 1024,
|
|
171
|
+
multipartChunkSize: 5 * 1024 * 1024,
|
|
172
|
+
multipartMinLastPartSize: 1024 * 1024,
|
|
173
|
+
maxConcurrentRequests: 4,
|
|
174
|
+
pollingTimeoutMilliseconds: 10000,
|
|
175
|
+
pusherKey: '79ae88bd931ea68464d9'
|
|
176
|
+
};
|
|
177
|
+
const defaultContentType = 'application/octet-stream';
|
|
178
|
+
const defaultFilename = 'original';
|
|
179
|
+
|
|
160
180
|
const request = ({ method, url, data, headers = {}, signal, onProgress }) => new Promise((resolve, reject) => {
|
|
161
181
|
const xhr = new XMLHttpRequest();
|
|
162
182
|
const requestMethod = method?.toUpperCase() || 'GET';
|
|
@@ -257,33 +277,24 @@ const getFileOptions = ({ name }) => name ? [name] : [];
|
|
|
257
277
|
const transformFile = identity;
|
|
258
278
|
var getFormData = () => new FormData();
|
|
259
279
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
*/
|
|
263
|
-
const isFileData = (data) => {
|
|
264
|
-
return (data !== undefined &&
|
|
265
|
-
((typeof Blob !== 'undefined' && data instanceof Blob) ||
|
|
266
|
-
(typeof File !== 'undefined' && data instanceof File) ||
|
|
267
|
-
(typeof Buffer !== 'undefined' && data instanceof Buffer) ||
|
|
268
|
-
(typeof data === 'string' && data.startsWith('file:'))));
|
|
280
|
+
const isBlob = (data) => {
|
|
281
|
+
return typeof Blob !== 'undefined' && data instanceof Blob;
|
|
269
282
|
};
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
*/
|
|
273
|
-
const isUuid = (data) => {
|
|
274
|
-
const UUID_REGEX = '[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}';
|
|
275
|
-
const regExp = new RegExp(UUID_REGEX);
|
|
276
|
-
return !isFileData(data) && regExp.test(data);
|
|
283
|
+
const isFile = (data) => {
|
|
284
|
+
return typeof File !== 'undefined' && data instanceof File;
|
|
277
285
|
};
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
286
|
+
const isBuffer = (data) => {
|
|
287
|
+
return typeof Buffer !== 'undefined' && data instanceof Buffer;
|
|
288
|
+
};
|
|
289
|
+
const isReactNativeAsset = (data) => {
|
|
290
|
+
return (!!data &&
|
|
291
|
+
typeof data === 'object' &&
|
|
292
|
+
!Array.isArray(data) &&
|
|
293
|
+
'uri' in data &&
|
|
294
|
+
typeof data.uri === 'string');
|
|
295
|
+
};
|
|
296
|
+
const isFileData = (data) => {
|
|
297
|
+
return (isBlob(data) || isFile(data) || isBuffer(data) || isReactNativeAsset(data));
|
|
287
298
|
};
|
|
288
299
|
|
|
289
300
|
const isSimpleValue = (value) => {
|
|
@@ -334,6 +345,19 @@ function buildFormData(options) {
|
|
|
334
345
|
return formData;
|
|
335
346
|
}
|
|
336
347
|
|
|
348
|
+
class UploadClientError extends Error {
|
|
349
|
+
constructor(message, code, request, response, headers) {
|
|
350
|
+
super();
|
|
351
|
+
this.name = 'UploadClientError';
|
|
352
|
+
this.message = message;
|
|
353
|
+
this.code = code;
|
|
354
|
+
this.request = request;
|
|
355
|
+
this.response = response;
|
|
356
|
+
this.headers = headers;
|
|
357
|
+
Object.setPrototypeOf(this, UploadClientError.prototype);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
337
361
|
const buildSearchParams = (query) => {
|
|
338
362
|
const searchParams = new URLSearchParams();
|
|
339
363
|
for (const [key, value] of Object.entries(query)) {
|
|
@@ -365,26 +389,6 @@ const getUrl = (base, path, query) => {
|
|
|
365
389
|
return url.toString();
|
|
366
390
|
};
|
|
367
391
|
|
|
368
|
-
/*
|
|
369
|
-
Settings for future support:
|
|
370
|
-
parallelDirectUploads: 10,
|
|
371
|
-
*/
|
|
372
|
-
const defaultSettings = {
|
|
373
|
-
baseCDN: 'https://ucarecdn.com',
|
|
374
|
-
baseURL: 'https://upload.uploadcare.com',
|
|
375
|
-
maxContentLength: 50 * 1024 * 1024,
|
|
376
|
-
retryThrottledRequestMaxTimes: 1,
|
|
377
|
-
retryNetworkErrorMaxTimes: 3,
|
|
378
|
-
multipartMinFileSize: 25 * 1024 * 1024,
|
|
379
|
-
multipartChunkSize: 5 * 1024 * 1024,
|
|
380
|
-
multipartMinLastPartSize: 1024 * 1024,
|
|
381
|
-
maxConcurrentRequests: 4,
|
|
382
|
-
pollingTimeoutMilliseconds: 10000,
|
|
383
|
-
pusherKey: '79ae88bd931ea68464d9'
|
|
384
|
-
};
|
|
385
|
-
const defaultContentType = 'application/octet-stream';
|
|
386
|
-
const defaultFilename = 'original';
|
|
387
|
-
|
|
388
392
|
var version = '6.0.0';
|
|
389
393
|
|
|
390
394
|
const LIBRARY_NAME = 'UploadcareUploadClient';
|
|
@@ -397,19 +401,6 @@ function getUserAgent(options) {
|
|
|
397
401
|
});
|
|
398
402
|
}
|
|
399
403
|
|
|
400
|
-
class UploadClientError extends Error {
|
|
401
|
-
constructor(message, code, request, response, headers) {
|
|
402
|
-
super();
|
|
403
|
-
this.name = 'UploadClientError';
|
|
404
|
-
this.message = message;
|
|
405
|
-
this.code = code;
|
|
406
|
-
this.request = request;
|
|
407
|
-
this.response = response;
|
|
408
|
-
this.headers = headers;
|
|
409
|
-
Object.setPrototypeOf(this, UploadClientError.prototype);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
404
|
const REQUEST_WAS_THROTTLED_CODE = 'RequestThrottledError';
|
|
414
405
|
const DEFAULT_RETRY_AFTER_TIMEOUT = 15000;
|
|
415
406
|
const DEFAULT_NETWORK_ERROR_TIMEOUT = 1000;
|
|
@@ -440,6 +431,36 @@ function retryIfFailed(fn, options) {
|
|
|
440
431
|
}));
|
|
441
432
|
}
|
|
442
433
|
|
|
434
|
+
const getContentType = (file) => {
|
|
435
|
+
let contentType = '';
|
|
436
|
+
if (isBlob(file) || isFile(file) || isReactNativeAsset(file)) {
|
|
437
|
+
contentType = file.type;
|
|
438
|
+
}
|
|
439
|
+
if (contentType) {
|
|
440
|
+
return contentType;
|
|
441
|
+
}
|
|
442
|
+
console.warn(`Cannot determine content type for ${file}. Using default content type: ${defaultContentType}`);
|
|
443
|
+
return defaultContentType;
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
const getFilename = (file) => {
|
|
447
|
+
let filename = '';
|
|
448
|
+
if (isBlob(file) || isBuffer(file)) {
|
|
449
|
+
filename = '';
|
|
450
|
+
}
|
|
451
|
+
else if (isFile(file) && file.name) {
|
|
452
|
+
filename = file.name;
|
|
453
|
+
}
|
|
454
|
+
else if (isReactNativeAsset(file) && file.name) {
|
|
455
|
+
filename = file.name;
|
|
456
|
+
}
|
|
457
|
+
if (filename) {
|
|
458
|
+
return filename;
|
|
459
|
+
}
|
|
460
|
+
console.warn(`Cannot determine filename for ${file}. Using default filename: ${defaultFilename}`);
|
|
461
|
+
return defaultFilename;
|
|
462
|
+
};
|
|
463
|
+
|
|
443
464
|
function getStoreValue(store) {
|
|
444
465
|
return typeof store === 'undefined' ? 'auto' : store ? '1' : '0';
|
|
445
466
|
}
|
|
@@ -460,8 +481,8 @@ function base(file, { publicKey, fileName, contentType, baseURL = defaultSetting
|
|
|
460
481
|
data: buildFormData({
|
|
461
482
|
file: {
|
|
462
483
|
data: file,
|
|
463
|
-
name: fileName
|
|
464
|
-
contentType
|
|
484
|
+
name: fileName || getFilename(file),
|
|
485
|
+
contentType: contentType || getContentType(file)
|
|
465
486
|
},
|
|
466
487
|
UPLOADCARE_PUB_KEY: publicKey,
|
|
467
488
|
UPLOADCARE_STORE: getStoreValue(store),
|
|
@@ -659,9 +680,9 @@ function multipartStart(size, { publicKey, contentType, fileName, multipartChunk
|
|
|
659
680
|
'X-UC-User-Agent': getUserAgent({ publicKey, integration, userAgent })
|
|
660
681
|
},
|
|
661
682
|
data: buildFormData({
|
|
662
|
-
filename: fileName
|
|
683
|
+
filename: fileName || defaultFilename,
|
|
663
684
|
size: size,
|
|
664
|
-
content_type: contentType
|
|
685
|
+
content_type: contentType || defaultContentType,
|
|
665
686
|
part_size: multipartChunkSize,
|
|
666
687
|
UPLOADCARE_STORE: getStoreValue(store),
|
|
667
688
|
UPLOADCARE_PUB_KEY: publicKey,
|
|
@@ -738,6 +759,28 @@ function multipartComplete(uuid, { publicKey, baseURL = defaultSettings.baseURL,
|
|
|
738
759
|
}), { retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes });
|
|
739
760
|
}
|
|
740
761
|
|
|
762
|
+
function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, signal, onProgress }) {
|
|
763
|
+
return poll({
|
|
764
|
+
check: (signal) => info(file, {
|
|
765
|
+
publicKey,
|
|
766
|
+
baseURL,
|
|
767
|
+
signal,
|
|
768
|
+
source,
|
|
769
|
+
integration,
|
|
770
|
+
userAgent,
|
|
771
|
+
retryThrottledRequestMaxTimes,
|
|
772
|
+
retryNetworkErrorMaxTimes
|
|
773
|
+
}).then((response) => {
|
|
774
|
+
if (response.isReady) {
|
|
775
|
+
return response;
|
|
776
|
+
}
|
|
777
|
+
onProgress && onProgress({ isComputable: true, value: 1 });
|
|
778
|
+
return false;
|
|
779
|
+
}),
|
|
780
|
+
signal
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
|
|
741
784
|
class UploadcareFile {
|
|
742
785
|
constructor(fileInfo, { baseCDN, fileName }) {
|
|
743
786
|
this.name = null;
|
|
@@ -775,28 +818,6 @@ class UploadcareFile {
|
|
|
775
818
|
}
|
|
776
819
|
}
|
|
777
820
|
|
|
778
|
-
function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, signal, onProgress }) {
|
|
779
|
-
return poll({
|
|
780
|
-
check: (signal) => info(file, {
|
|
781
|
-
publicKey,
|
|
782
|
-
baseURL,
|
|
783
|
-
signal,
|
|
784
|
-
source,
|
|
785
|
-
integration,
|
|
786
|
-
userAgent,
|
|
787
|
-
retryThrottledRequestMaxTimes,
|
|
788
|
-
retryNetworkErrorMaxTimes
|
|
789
|
-
}).then((response) => {
|
|
790
|
-
if (response.isReady) {
|
|
791
|
-
return response;
|
|
792
|
-
}
|
|
793
|
-
onProgress && onProgress({ isComputable: true, value: 1 });
|
|
794
|
-
return false;
|
|
795
|
-
}),
|
|
796
|
-
signal
|
|
797
|
-
});
|
|
798
|
-
}
|
|
799
|
-
|
|
800
821
|
const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }) => {
|
|
801
822
|
return base(file, {
|
|
802
823
|
publicKey,
|
|
@@ -832,6 +853,29 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
|
|
|
832
853
|
.then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
|
|
833
854
|
};
|
|
834
855
|
|
|
856
|
+
const uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN }) => {
|
|
857
|
+
return info(uuid, {
|
|
858
|
+
publicKey,
|
|
859
|
+
baseURL,
|
|
860
|
+
signal,
|
|
861
|
+
source,
|
|
862
|
+
integration,
|
|
863
|
+
userAgent,
|
|
864
|
+
retryThrottledRequestMaxTimes,
|
|
865
|
+
retryNetworkErrorMaxTimes
|
|
866
|
+
})
|
|
867
|
+
.then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }))
|
|
868
|
+
.then((result) => {
|
|
869
|
+
// hack for node ¯\_(ツ)_/¯
|
|
870
|
+
if (onProgress)
|
|
871
|
+
onProgress({
|
|
872
|
+
isComputable: true,
|
|
873
|
+
value: 1
|
|
874
|
+
});
|
|
875
|
+
return result;
|
|
876
|
+
});
|
|
877
|
+
};
|
|
878
|
+
|
|
835
879
|
const race = (fns, { signal } = {}) => {
|
|
836
880
|
let lastError = null;
|
|
837
881
|
let winnerIndex = null;
|
|
@@ -1171,35 +1215,30 @@ const uploadFromUrl = (sourceUrl, { publicKey, fileName, baseURL, baseCDN, check
|
|
|
1171
1215
|
}))
|
|
1172
1216
|
.then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
|
|
1173
1217
|
|
|
1174
|
-
const
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
retryThrottledRequestMaxTimes,
|
|
1183
|
-
retryNetworkErrorMaxTimes
|
|
1184
|
-
})
|
|
1185
|
-
.then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }))
|
|
1186
|
-
.then((result) => {
|
|
1187
|
-
// hack for node ¯\_(ツ)_/¯
|
|
1188
|
-
if (onProgress)
|
|
1189
|
-
onProgress({
|
|
1190
|
-
isComputable: true,
|
|
1191
|
-
value: 1
|
|
1192
|
-
});
|
|
1193
|
-
return result;
|
|
1194
|
-
});
|
|
1218
|
+
const memo = new WeakMap();
|
|
1219
|
+
const getReactNativeBlob = async (asset) => {
|
|
1220
|
+
if (memo.has(asset)) {
|
|
1221
|
+
return memo.get(asset);
|
|
1222
|
+
}
|
|
1223
|
+
const blob = await fetch(asset.uri).then((res) => res.blob());
|
|
1224
|
+
memo.set(asset, blob);
|
|
1225
|
+
return blob;
|
|
1195
1226
|
};
|
|
1196
1227
|
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1228
|
+
const getFileSize = async (file) => {
|
|
1229
|
+
if (isBuffer(file)) {
|
|
1230
|
+
return file.length;
|
|
1231
|
+
}
|
|
1232
|
+
if (isFile(file) || isBlob(file)) {
|
|
1233
|
+
return file.size;
|
|
1234
|
+
}
|
|
1235
|
+
if (isReactNativeAsset(file)) {
|
|
1236
|
+
const blob = await getReactNativeBlob(file);
|
|
1237
|
+
return blob.size;
|
|
1238
|
+
}
|
|
1239
|
+
throw new Error(`Failed to get file size for file: ${file}`);
|
|
1202
1240
|
};
|
|
1241
|
+
|
|
1203
1242
|
/**
|
|
1204
1243
|
* Check if FileData is multipart data.
|
|
1205
1244
|
*/
|
|
@@ -1207,15 +1246,24 @@ const isMultipart = (fileSize, multipartMinFileSize = defaultSettings.multipartM
|
|
|
1207
1246
|
return fileSize >= multipartMinFileSize;
|
|
1208
1247
|
};
|
|
1209
1248
|
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1249
|
+
/**
|
|
1250
|
+
* Uuid type guard.
|
|
1251
|
+
*/
|
|
1252
|
+
const isUuid = (data) => {
|
|
1253
|
+
const UUID_REGEX = '[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}';
|
|
1254
|
+
const regExp = new RegExp(UUID_REGEX);
|
|
1255
|
+
return !isFileData(data) && regExp.test(data);
|
|
1256
|
+
};
|
|
1257
|
+
/**
|
|
1258
|
+
* Url type guard.
|
|
1259
|
+
*
|
|
1260
|
+
* @param {AnyFile | Url | Uuid} data
|
|
1261
|
+
*/
|
|
1262
|
+
const isUrl = (data) => {
|
|
1263
|
+
const URL_REGEX = '^(?:\\w+:)?\\/\\/([^\\s\\.]+\\.\\S{2}|localhost[\\:?\\d]*)\\S*$';
|
|
1264
|
+
const regExp = new RegExp(URL_REGEX);
|
|
1265
|
+
return !isFileData(data) && regExp.test(data);
|
|
1214
1266
|
};
|
|
1215
|
-
|
|
1216
|
-
function prepareChunks(file, fileSize, chunkSize) {
|
|
1217
|
-
return (index) => sliceChunk(file, index, fileSize, chunkSize);
|
|
1218
|
-
}
|
|
1219
1267
|
|
|
1220
1268
|
const runWithConcurrency = (concurrency, tasks) => {
|
|
1221
1269
|
return new Promise((resolve, reject) => {
|
|
@@ -1252,6 +1300,16 @@ const runWithConcurrency = (concurrency, tasks) => {
|
|
|
1252
1300
|
});
|
|
1253
1301
|
};
|
|
1254
1302
|
|
|
1303
|
+
const sliceChunk = (file, index, fileSize, chunkSize) => {
|
|
1304
|
+
const start = chunkSize * index;
|
|
1305
|
+
const end = Math.min(start + chunkSize, fileSize);
|
|
1306
|
+
return file.slice(start, end);
|
|
1307
|
+
};
|
|
1308
|
+
|
|
1309
|
+
const prepareChunks = async (file, fileSize, chunkSize) => {
|
|
1310
|
+
return (index) => sliceChunk(file, index, fileSize, chunkSize);
|
|
1311
|
+
};
|
|
1312
|
+
|
|
1255
1313
|
const uploadPart = (chunk, url, { publicKey, onProgress, signal, integration, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes }) => multipartUpload(chunk, url, {
|
|
1256
1314
|
publicKey,
|
|
1257
1315
|
onProgress,
|
|
@@ -1260,8 +1318,8 @@ const uploadPart = (chunk, url, { publicKey, onProgress, signal, integration, re
|
|
|
1260
1318
|
retryThrottledRequestMaxTimes,
|
|
1261
1319
|
retryNetworkErrorMaxTimes
|
|
1262
1320
|
});
|
|
1263
|
-
const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize = defaultSettings.multipartChunkSize, maxConcurrentRequests = defaultSettings.maxConcurrentRequests, baseCDN, metadata }) => {
|
|
1264
|
-
const size = fileSize || getFileSize(file);
|
|
1321
|
+
const uploadMultipart = async (file, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize = defaultSettings.multipartChunkSize, maxConcurrentRequests = defaultSettings.maxConcurrentRequests, baseCDN, metadata }) => {
|
|
1322
|
+
const size = fileSize || await getFileSize(file);
|
|
1265
1323
|
let progressValues;
|
|
1266
1324
|
const createProgressHandler = (totalChunks, chunkIdx) => {
|
|
1267
1325
|
if (!onProgress)
|
|
@@ -1283,8 +1341,8 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
|
|
|
1283
1341
|
};
|
|
1284
1342
|
return multipartStart(size, {
|
|
1285
1343
|
publicKey,
|
|
1286
|
-
contentType,
|
|
1287
|
-
fileName: fileName
|
|
1344
|
+
contentType: contentType || getContentType(file),
|
|
1345
|
+
fileName: fileName || getFilename(file),
|
|
1288
1346
|
baseURL,
|
|
1289
1347
|
secureSignature,
|
|
1290
1348
|
secureExpire,
|
|
@@ -1297,8 +1355,8 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
|
|
|
1297
1355
|
retryNetworkErrorMaxTimes,
|
|
1298
1356
|
metadata
|
|
1299
1357
|
})
|
|
1300
|
-
.then(({ uuid, parts }) => {
|
|
1301
|
-
const getChunk = prepareChunks(file, size, multipartChunkSize);
|
|
1358
|
+
.then(async ({ uuid, parts }) => {
|
|
1359
|
+
const getChunk = await prepareChunks(file, size, multipartChunkSize);
|
|
1302
1360
|
return Promise.all([
|
|
1303
1361
|
uuid,
|
|
1304
1362
|
runWithConcurrency(maxConcurrentRequests, parts.map((url, index) => () => uploadPart(getChunk(index), url, {
|
|
@@ -1345,14 +1403,15 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
|
|
|
1345
1403
|
/**
|
|
1346
1404
|
* Uploads file from provided data.
|
|
1347
1405
|
*/
|
|
1348
|
-
function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartMinFileSize, multipartChunkSize, maxConcurrentRequests, baseCDN = defaultSettings.baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, pusherKey, metadata }) {
|
|
1406
|
+
async function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartMinFileSize, multipartChunkSize, maxConcurrentRequests, baseCDN = defaultSettings.baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, pusherKey, metadata }) {
|
|
1349
1407
|
if (isFileData(data)) {
|
|
1350
|
-
const fileSize = getFileSize(data);
|
|
1408
|
+
const fileSize = await getFileSize(data);
|
|
1351
1409
|
if (isMultipart(fileSize, multipartMinFileSize)) {
|
|
1352
1410
|
return uploadMultipart(data, {
|
|
1353
1411
|
publicKey,
|
|
1354
1412
|
contentType,
|
|
1355
1413
|
multipartChunkSize,
|
|
1414
|
+
fileSize,
|
|
1356
1415
|
fileName,
|
|
1357
1416
|
baseURL,
|
|
1358
1417
|
secureSignature,
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,42 @@ export declare type ContentInfo = {
|
|
|
70
70
|
image?: ImageInfo;
|
|
71
71
|
video?: VideoInfo;
|
|
72
72
|
};
|
|
73
|
+
export interface DefaultSettings {
|
|
74
|
+
baseCDN: string;
|
|
75
|
+
baseURL: string;
|
|
76
|
+
maxContentLength: number;
|
|
77
|
+
retryThrottledRequestMaxTimes: number;
|
|
78
|
+
retryNetworkErrorMaxTimes: number;
|
|
79
|
+
multipartMinFileSize: number;
|
|
80
|
+
multipartChunkSize: number;
|
|
81
|
+
multipartMinLastPartSize: number;
|
|
82
|
+
maxConcurrentRequests: number;
|
|
83
|
+
pollingTimeoutMilliseconds: number;
|
|
84
|
+
pusherKey: string;
|
|
85
|
+
}
|
|
86
|
+
export interface Settings extends Partial<DefaultSettings> {
|
|
87
|
+
publicKey: string;
|
|
88
|
+
fileName?: string;
|
|
89
|
+
contentType?: string;
|
|
90
|
+
store?: boolean;
|
|
91
|
+
secureSignature?: string;
|
|
92
|
+
secureExpire?: string;
|
|
93
|
+
integration?: string;
|
|
94
|
+
userAgent?: CustomUserAgent;
|
|
95
|
+
checkForUrlDuplicates?: boolean;
|
|
96
|
+
saveUrlForRecurrentUploads?: boolean;
|
|
97
|
+
source?: string;
|
|
98
|
+
jsonpCallback?: string;
|
|
99
|
+
}
|
|
100
|
+
export declare type BrowserFile = Blob | File;
|
|
101
|
+
export declare type NodeFile = Buffer;
|
|
102
|
+
export declare type ReactNativeAsset = {
|
|
103
|
+
type: string;
|
|
104
|
+
uri: string;
|
|
105
|
+
name?: string;
|
|
106
|
+
};
|
|
107
|
+
export declare type ReactNativeFile = ReactNativeAsset | Blob;
|
|
108
|
+
export declare type AnyFile = BrowserFile | NodeFile | ReactNativeFile;
|
|
73
109
|
export declare type FileInfo = {
|
|
74
110
|
size: number;
|
|
75
111
|
done: number;
|
|
@@ -112,18 +148,6 @@ export declare type ProgressCallback<T = ComputableProgressInfo | UnknownProgres
|
|
|
112
148
|
export declare type Metadata = {
|
|
113
149
|
[key: string]: string;
|
|
114
150
|
};
|
|
115
|
-
export declare type Headers = {
|
|
116
|
-
[key: string]: string | string[] | undefined;
|
|
117
|
-
};
|
|
118
|
-
export declare type ErrorRequestInfo = {
|
|
119
|
-
method?: string;
|
|
120
|
-
url: string;
|
|
121
|
-
query?: string;
|
|
122
|
-
data?: NodeFormData | FormData | BrowserFile | NodeFile;
|
|
123
|
-
headers?: Headers;
|
|
124
|
-
};
|
|
125
|
-
export declare type BrowserFile = Blob | File;
|
|
126
|
-
export declare type NodeFile = Buffer;
|
|
127
151
|
export declare type BaseResponse = {
|
|
128
152
|
file: Uuid;
|
|
129
153
|
};
|
|
@@ -148,7 +172,7 @@ export declare type BaseOptions = {
|
|
|
148
172
|
* Performs file uploading request to Uploadcare Upload API.
|
|
149
173
|
* Can be canceled and has progress.
|
|
150
174
|
*/
|
|
151
|
-
export function base(file:
|
|
175
|
+
export function base(file: AnyFile, { publicKey, fileName, contentType, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata }: BaseOptions): Promise<BaseResponse>;
|
|
152
176
|
declare enum TypeEnum {
|
|
153
177
|
Token = "token",
|
|
154
178
|
FileInfo = "file_info"
|
|
@@ -309,7 +333,7 @@ export declare type MultipartUploadResponse = {
|
|
|
309
333
|
/**
|
|
310
334
|
* Complete multipart uploading.
|
|
311
335
|
*/
|
|
312
|
-
export function multipartUpload(part:
|
|
336
|
+
export function multipartUpload(part: AnyFile, url: MultipartPart, { signal, onProgress, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes }: MultipartUploadOptions): Promise<MultipartUploadResponse>;
|
|
313
337
|
export declare type MultipartCompleteOptions = {
|
|
314
338
|
publicKey: string;
|
|
315
339
|
baseURL?: string;
|
|
@@ -362,13 +386,7 @@ export declare type DirectOptions = {
|
|
|
362
386
|
baseCDN?: string;
|
|
363
387
|
metadata?: Metadata;
|
|
364
388
|
};
|
|
365
|
-
export declare const uploadDirect: (file:
|
|
366
|
-
export declare type UploadFromUrlOptions = {
|
|
367
|
-
baseCDN?: string;
|
|
368
|
-
onProgress?: ProgressCallback;
|
|
369
|
-
pusherKey?: string;
|
|
370
|
-
} & FromUrlOptions;
|
|
371
|
-
export declare const uploadFromUrl: (sourceUrl: string, { publicKey, fileName, baseURL, baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, pusherKey, metadata }: UploadFromUrlOptions) => Promise<UploadcareFile>;
|
|
389
|
+
export declare const uploadDirect: (file: AnyFile, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }: DirectOptions) => Promise<UploadcareFile>;
|
|
372
390
|
export declare type FromUploadedOptions = {
|
|
373
391
|
publicKey: string;
|
|
374
392
|
fileName?: string;
|
|
@@ -383,6 +401,12 @@ export declare type FromUploadedOptions = {
|
|
|
383
401
|
baseCDN?: string;
|
|
384
402
|
};
|
|
385
403
|
export declare const uploadFromUploaded: (uuid: Uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN }: FromUploadedOptions) => Promise<UploadcareFile>;
|
|
404
|
+
export declare type UploadFromUrlOptions = {
|
|
405
|
+
baseCDN?: string;
|
|
406
|
+
onProgress?: ProgressCallback;
|
|
407
|
+
pusherKey?: string;
|
|
408
|
+
} & FromUrlOptions;
|
|
409
|
+
export declare const uploadFromUrl: (sourceUrl: string, { publicKey, fileName, baseURL, baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, pusherKey, metadata }: UploadFromUrlOptions) => Promise<UploadcareFile>;
|
|
386
410
|
export declare type MultipartOptions = {
|
|
387
411
|
publicKey: string;
|
|
388
412
|
contentType?: string;
|
|
@@ -404,7 +428,7 @@ export declare type MultipartOptions = {
|
|
|
404
428
|
baseCDN?: string;
|
|
405
429
|
metadata?: Metadata;
|
|
406
430
|
};
|
|
407
|
-
export declare const uploadMultipart: (file:
|
|
431
|
+
export declare const uploadMultipart: (file: AnyFile, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, maxConcurrentRequests, baseCDN, metadata }: MultipartOptions) => Promise<UploadcareFile>;
|
|
408
432
|
export declare type FileFromOptions = {
|
|
409
433
|
publicKey: string;
|
|
410
434
|
fileName?: string;
|
|
@@ -432,7 +456,7 @@ export declare type FileFromOptions = {
|
|
|
432
456
|
/**
|
|
433
457
|
* Uploads file from provided data.
|
|
434
458
|
*/
|
|
435
|
-
export declare function uploadFile(data:
|
|
459
|
+
export declare function uploadFile(data: AnyFile | Url | Uuid, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartMinFileSize, multipartChunkSize, maxConcurrentRequests, baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, pusherKey, metadata }: FileFromOptions): Promise<UploadcareFile>;
|
|
436
460
|
export declare class UploadcareGroup {
|
|
437
461
|
readonly uuid: GroupId;
|
|
438
462
|
readonly filesCount: string;
|
|
@@ -448,51 +472,34 @@ export declare class UploadcareGroup {
|
|
|
448
472
|
export declare type GroupFromOptions = {
|
|
449
473
|
jsonpCallback?: string;
|
|
450
474
|
};
|
|
451
|
-
export function uploadFileGroup(data:
|
|
452
|
-
export interface DefaultSettings {
|
|
453
|
-
baseCDN: string;
|
|
454
|
-
baseURL: string;
|
|
455
|
-
maxContentLength: number;
|
|
456
|
-
retryThrottledRequestMaxTimes: number;
|
|
457
|
-
retryNetworkErrorMaxTimes: number;
|
|
458
|
-
multipartMinFileSize: number;
|
|
459
|
-
multipartChunkSize: number;
|
|
460
|
-
multipartMinLastPartSize: number;
|
|
461
|
-
maxConcurrentRequests: number;
|
|
462
|
-
pollingTimeoutMilliseconds: number;
|
|
463
|
-
pusherKey: string;
|
|
464
|
-
}
|
|
465
|
-
export interface Settings extends Partial<DefaultSettings> {
|
|
466
|
-
publicKey: string;
|
|
467
|
-
fileName?: string;
|
|
468
|
-
contentType?: string;
|
|
469
|
-
store?: boolean;
|
|
470
|
-
secureSignature?: string;
|
|
471
|
-
secureExpire?: string;
|
|
472
|
-
integration?: string;
|
|
473
|
-
userAgent?: CustomUserAgent;
|
|
474
|
-
checkForUrlDuplicates?: boolean;
|
|
475
|
-
saveUrlForRecurrentUploads?: boolean;
|
|
476
|
-
source?: string;
|
|
477
|
-
jsonpCallback?: string;
|
|
478
|
-
}
|
|
475
|
+
export function uploadFileGroup(data: AnyFile[] | Url[] | Uuid[], { publicKey, fileName, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, baseCDN, jsonpCallback }: FileFromOptions & GroupFromOptions): Promise<UploadcareGroup>;
|
|
479
476
|
export declare class UploadClient {
|
|
480
477
|
private settings;
|
|
481
478
|
constructor(settings: Settings);
|
|
482
479
|
updateSettings(newSettings: Settings): void;
|
|
483
480
|
getSettings(): Settings;
|
|
484
|
-
base(file:
|
|
481
|
+
base(file: AnyFile, options?: Partial<BaseOptions>): Promise<BaseResponse>;
|
|
485
482
|
info(uuid: Uuid, options?: Partial<InfoOptions>): Promise<FileInfo>;
|
|
486
483
|
fromUrl(sourceUrl: Url, options?: Partial<FromUrlOptions>): Promise<FromUrlResponse>;
|
|
487
484
|
fromUrlStatus(token: Token, options?: Partial<FromUrlStatusOptions>): Promise<FromUrlStatusResponse>;
|
|
488
485
|
group(uuids: Uuid[], options?: Partial<GroupOptions>): Promise<GroupInfo>;
|
|
489
486
|
groupInfo(id: GroupId, options?: Partial<GroupInfoOptions>): Promise<GroupInfo>;
|
|
490
487
|
multipartStart(size: number, options?: Partial<MultipartStartOptions>): Promise<MultipartStartResponse>;
|
|
491
|
-
multipartUpload(part:
|
|
488
|
+
multipartUpload(part: BrowserFile | NodeFile, url: MultipartPart, options?: Partial<MultipartUploadOptions>): Promise<MultipartUploadResponse>;
|
|
492
489
|
multipartComplete(uuid: Uuid, options?: Partial<MultipartCompleteOptions>): Promise<FileInfo>;
|
|
493
|
-
uploadFile(data:
|
|
494
|
-
uploadFileGroup(data: (
|
|
490
|
+
uploadFile(data: AnyFile | Url | Uuid, options?: Partial<FileFromOptions>): Promise<UploadcareFile>;
|
|
491
|
+
uploadFileGroup(data: (AnyFile)[] | Url[] | Uuid[], options?: Partial<FileFromOptions & GroupFromOptions>): Promise<UploadcareGroup>;
|
|
495
492
|
}
|
|
493
|
+
export declare type Headers = {
|
|
494
|
+
[key: string]: string | string[] | undefined;
|
|
495
|
+
};
|
|
496
|
+
export declare type ErrorRequestInfo = {
|
|
497
|
+
method?: string;
|
|
498
|
+
url: string;
|
|
499
|
+
query?: string;
|
|
500
|
+
data?: NodeFormData | FormData | AnyFile;
|
|
501
|
+
headers?: Headers;
|
|
502
|
+
};
|
|
496
503
|
export declare type ErrorResponseInfo = {
|
|
497
504
|
error?: {
|
|
498
505
|
statusCode: number;
|