@uploadcare/upload-client 6.0.1-alpha.1 → 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.
@@ -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
- * FileData type guard.
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
- * Uuid type guard.
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
- * Url type guard.
280
- *
281
- * @param {NodeFile | BrowserFile | Url | Uuid} data
282
- */
283
- const isUrl = (data) => {
284
- const URL_REGEX = '^(?:\\w+:)?\\/\\/([^\\s\\.]+\\.\\S{2}|localhost[\\:?\\d]*)\\S*$';
285
- const regExp = new RegExp(URL_REGEX);
286
- return !isFileData(data) && regExp.test(data);
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 ?? file?.name ?? defaultFilename,
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 ?? defaultFilename,
683
+ filename: fileName || defaultFilename,
663
684
  size: size,
664
- content_type: contentType ?? defaultContentType,
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 uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN }) => {
1175
- return info(uuid, {
1176
- publicKey,
1177
- baseURL,
1178
- signal,
1179
- source,
1180
- integration,
1181
- userAgent,
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
- * Get file size.
1199
- */
1200
- const getFileSize = (file) => {
1201
- return file.length || file.size;
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
- const sliceChunk = (file, index, fileSize, chunkSize) => {
1211
- const start = chunkSize * index;
1212
- const end = Math.min(start + chunkSize, fileSize);
1213
- return file.slice(start, end);
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 ?? file.name,
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: NodeFile | BrowserFile, { publicKey, fileName, contentType, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata }: BaseOptions): Promise<BaseResponse>;
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: NodeFile | BrowserFile, url: MultipartPart, { signal, onProgress, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes }: MultipartUploadOptions): Promise<MultipartUploadResponse>;
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: NodeFile | BrowserFile, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }: DirectOptions) => Promise<UploadcareFile>;
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: NodeFile | BrowserFile, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, maxConcurrentRequests, baseCDN, metadata }: MultipartOptions) => Promise<UploadcareFile>;
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: NodeFile | BrowserFile | 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>;
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: (NodeFile | BrowserFile)[] | Url[] | Uuid[], { publicKey, fileName, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, baseCDN, jsonpCallback }: FileFromOptions & GroupFromOptions): Promise<UploadcareGroup>;
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: NodeFile | BrowserFile, options?: Partial<BaseOptions>): Promise<BaseResponse>;
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: Buffer | Blob, url: MultipartPart, options?: Partial<MultipartUploadOptions>): Promise<MultipartUploadResponse>;
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: NodeFile | BrowserFile | Url | Uuid, options?: Partial<FileFromOptions>): Promise<UploadcareFile>;
494
- uploadFileGroup(data: (NodeFile | BrowserFile)[] | Url[] | Uuid[], options?: Partial<FileFromOptions & GroupFromOptions>): Promise<UploadcareGroup>;
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;