@uploadcare/upload-client 6.18.3 → 6.19.0-alpha.0

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 CHANGED
@@ -6,8 +6,7 @@
6
6
  alt="">
7
7
  </a>
8
8
 
9
- This is an Uploadcare [Upload API][uc-docs-upload-api] wrapper to work with
10
- Node.js and browser.
9
+ `@uploadcare/upload-client` is a JavaScript and TypeScript SDK for the Uploadcare [Upload API][uc-docs-upload-api]. It handles direct binary uploads, multipart uploads for large files, URL-based and UUID-based uploads, and file group creation. Works in Node.js, browser, and React Native. Supports upload progress tracking, AbortController cancellation, concurrent request queuing, and signed uploads.
11
10
 
12
11
  [API Reference](https://uploadcare.github.io/uploadcare-js-api-clients/upload-client/)
13
12
 
@@ -405,7 +405,7 @@ const getUrl = (base, path, query) => {
405
405
  return url.toString();
406
406
  };
407
407
 
408
- var version = '6.18.3';
408
+ var version = '6.18.4';
409
409
 
410
410
  const LIBRARY_NAME = 'UploadcareUploadClient';
411
411
  const LIBRARY_VERSION = version;
@@ -480,7 +480,7 @@ function getStoreValue(store) {
480
480
  * Performs file uploading request to Uploadcare Upload API. Can be canceled and
481
481
  * has progress.
482
482
  */
483
- function base(file, { publicKey, fileName, contentType, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata }) {
483
+ function base(file, { publicKey, fileName, contentType, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata, tags }) {
484
484
  return retryIfFailed(() => request({
485
485
  method: 'POST',
486
486
  url: getUrl(baseURL, '/base/', {
@@ -500,7 +500,8 @@ function base(file, { publicKey, fileName, contentType, baseURL = defaultSetting
500
500
  signature: secureSignature,
501
501
  expire: secureExpire,
502
502
  source: source,
503
- metadata
503
+ metadata,
504
+ tags: tags && tags.join(',')
504
505
  }),
505
506
  signal,
506
507
  onProgress
@@ -673,7 +674,7 @@ function info(uuid, { publicKey, baseURL = defaultSettings.baseURL, signal, sour
673
674
  }
674
675
 
675
676
  /** Start multipart uploading. */
676
- function multipartStart(size, { publicKey, contentType, fileName, multipartChunkSize = defaultSettings.multipartChunkSize, baseURL = '', secureSignature, secureExpire, store, signal, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata }) {
677
+ function multipartStart(size, { publicKey, contentType, fileName, multipartChunkSize = defaultSettings.multipartChunkSize, baseURL = '', secureSignature, secureExpire, store, signal, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata, tags }) {
677
678
  return retryIfFailed(() => request({
678
679
  method: 'POST',
679
680
  url: getUrl(baseURL, '/multipart/start/', { jsonerrors: 1 }),
@@ -690,7 +691,8 @@ function multipartStart(size, { publicKey, contentType, fileName, multipartChunk
690
691
  signature: secureSignature,
691
692
  expire: secureExpire,
692
693
  source: source,
693
- metadata
694
+ metadata,
695
+ tags: tags && tags.join(',')
694
696
  }),
695
697
  signal
696
698
  }).then(({ data, headers, request }) => {
@@ -772,9 +774,9 @@ function isReadyPoll(uuid, { publicKey, baseURL, source, integration, userAgent,
772
774
  retryNetworkErrorMaxTimes
773
775
  }).then((response) => {
774
776
  if (response.isReady) {
777
+ onProgress && onProgress({ isComputable: true, value: 1 });
775
778
  return response;
776
779
  }
777
- onProgress && onProgress({ isComputable: true, value: 1 });
778
780
  return false;
779
781
  }),
780
782
  signal
@@ -798,6 +800,7 @@ class UploadcareFile {
798
800
  videoInfo;
799
801
  contentInfo;
800
802
  metadata;
803
+ tags;
801
804
  s3Bucket;
802
805
  defaultEffects = null;
803
806
  constructor(fileInfo, { baseCDN = defaultSettings.baseCDN, fileName } = {}) {
@@ -818,6 +821,7 @@ class UploadcareFile {
818
821
  this.videoInfo = fileInfo.videoInfo;
819
822
  this.contentInfo = fileInfo.contentInfo;
820
823
  this.metadata = fileInfo.metadata || null;
824
+ this.tags = fileInfo.tags || null;
821
825
  this.s3Bucket = s3Bucket || null;
822
826
  this.s3Url = s3Url;
823
827
  if (isGroupFileInfo(fileInfo)) {
@@ -826,7 +830,7 @@ class UploadcareFile {
826
830
  }
827
831
  }
828
832
 
829
- const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }) => {
833
+ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata, tags }) => {
830
834
  return base(file, {
831
835
  publicKey,
832
836
  fileName,
@@ -842,7 +846,8 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
842
846
  userAgent,
843
847
  retryThrottledRequestMaxTimes,
844
848
  retryNetworkErrorMaxTimes,
845
- metadata
849
+ metadata,
850
+ tags
846
851
  })
847
852
  .then(({ file }) => {
848
853
  return isReadyPoll(file, {
@@ -861,26 +866,17 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
861
866
  };
862
867
 
863
868
  const uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN }) => {
864
- return info(uuid, {
869
+ return isReadyPoll(uuid, {
865
870
  publicKey,
866
871
  baseURL,
867
872
  signal,
873
+ onProgress,
868
874
  source,
869
875
  integration,
870
876
  userAgent,
871
877
  retryThrottledRequestMaxTimes,
872
878
  retryNetworkErrorMaxTimes
873
- })
874
- .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }))
875
- .then((result) => {
876
- // hack for node ¯\_(ツ)_/¯
877
- if (onProgress)
878
- onProgress({
879
- isComputable: true,
880
- value: 1
881
- });
882
- return result;
883
- });
879
+ }).then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }));
884
880
  };
885
881
 
886
882
  const race = (fns, { signal } = {}) => {
@@ -1210,15 +1206,20 @@ const uploadFromUrl = (sourceUrl, { publicKey, fileName, baseURL, baseCDN, check
1210
1206
  throw result;
1211
1207
  return result;
1212
1208
  })
1213
- .then((result) => isReadyPoll(result.uuid, {
1214
- publicKey,
1215
- baseURL,
1216
- integration,
1217
- userAgent,
1218
- retryThrottledRequestMaxTimes,
1219
- onProgress,
1220
- signal
1221
- }))
1209
+ .then((result) => {
1210
+ if (result.isReady) {
1211
+ return result;
1212
+ }
1213
+ return isReadyPoll(result.uuid, {
1214
+ publicKey,
1215
+ baseURL,
1216
+ integration,
1217
+ userAgent,
1218
+ retryThrottledRequestMaxTimes,
1219
+ onProgress,
1220
+ signal
1221
+ });
1222
+ })
1222
1223
  .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1223
1224
 
1224
1225
  const memo = new WeakMap();
@@ -1318,7 +1319,7 @@ const uploadPart = (chunk, url, { publicKey, contentType, onProgress, signal, in
1318
1319
  retryThrottledRequestMaxTimes,
1319
1320
  retryNetworkErrorMaxTimes
1320
1321
  });
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 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, tags }) => {
1322
1323
  const size = fileSize ?? (await getFileSize(file));
1323
1324
  let progressValues;
1324
1325
  const createProgressHandler = (totalChunks, chunkIdx) => {
@@ -1355,6 +1356,7 @@ const uploadMultipart = async (file, { publicKey, fileName, fileSize, baseURL, s
1355
1356
  retryThrottledRequestMaxTimes,
1356
1357
  retryNetworkErrorMaxTimes,
1357
1358
  metadata,
1359
+ tags,
1358
1360
  multipartChunkSize
1359
1361
  })
1360
1362
  .then(async ({ uuid, parts }) => {
@@ -1385,25 +1387,23 @@ const uploadMultipart = async (file, { publicKey, fileName, fileSize, baseURL, s
1385
1387
  if (fileInfo.isReady) {
1386
1388
  return fileInfo;
1387
1389
  }
1388
- else {
1389
- return isReadyPoll(fileInfo.uuid, {
1390
- publicKey,
1391
- baseURL,
1392
- source,
1393
- integration,
1394
- userAgent,
1395
- retryThrottledRequestMaxTimes,
1396
- retryNetworkErrorMaxTimes,
1397
- onProgress,
1398
- signal
1399
- });
1400
- }
1390
+ return isReadyPoll(fileInfo.uuid, {
1391
+ publicKey,
1392
+ baseURL,
1393
+ source,
1394
+ integration,
1395
+ userAgent,
1396
+ retryThrottledRequestMaxTimes,
1397
+ retryNetworkErrorMaxTimes,
1398
+ onProgress,
1399
+ signal
1400
+ });
1401
1401
  })
1402
1402
  .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1403
1403
  };
1404
1404
 
1405
1405
  /** Uploads file from provided data. */
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 }) {
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, tags }) {
1407
1407
  if (isFileData(data)) {
1408
1408
  const fileSize = await getFileSize(data);
1409
1409
  if (isMultipart(fileSize, multipartMinFileSize)) {
@@ -1426,7 +1426,8 @@ async function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings
1426
1426
  retryThrottledRequestMaxTimes,
1427
1427
  retryNetworkErrorMaxTimes,
1428
1428
  baseCDN,
1429
- metadata
1429
+ metadata,
1430
+ tags
1430
1431
  });
1431
1432
  }
1432
1433
  return uploadDirect(data, {
@@ -1445,7 +1446,8 @@ async function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings
1445
1446
  retryThrottledRequestMaxTimes,
1446
1447
  retryNetworkErrorMaxTimes,
1447
1448
  baseCDN,
1448
- metadata
1449
+ metadata,
1450
+ tags
1449
1451
  });
1450
1452
  }
1451
1453
  if (isUrl(data)) {
@@ -73,6 +73,7 @@ export type ContentInfo = {
73
73
  video?: VideoInfo;
74
74
  };
75
75
  export type Metadata = Record<string, string>;
76
+ export type Tags = string[];
76
77
  export type StoreValue = "auto" | boolean;
77
78
  export declare class CancelError extends UploadcareError {
78
79
  isCancel: boolean;
@@ -125,12 +126,13 @@ export type FileInfo = {
125
126
  mimeType: string;
126
127
  isImage: boolean;
127
128
  isStored: boolean;
128
- isReady: string;
129
+ isReady: boolean;
129
130
  imageInfo: ImageInfo | null;
130
131
  videoInfo: VideoInfo | null;
131
132
  contentInfo: ContentInfo | null;
132
133
  s3Bucket?: string;
133
134
  metadata?: Metadata;
135
+ tags?: Tags;
134
136
  };
135
137
  export type GroupFileInfo = FileInfo & {
136
138
  defaultEffects: string;
@@ -175,12 +177,13 @@ export type BaseOptions = {
175
177
  retryThrottledRequestMaxTimes?: number;
176
178
  retryNetworkErrorMaxTimes?: number;
177
179
  metadata?: Metadata;
180
+ tags?: Tags;
178
181
  };
179
182
  /**
180
183
  * Performs file uploading request to Uploadcare Upload API. Can be canceled and
181
184
  * has progress.
182
185
  */
183
- export function base(file: SupportedFileInput, { publicKey, fileName, contentType, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata }: BaseOptions): Promise<BaseResponse>;
186
+ export function base(file: SupportedFileInput, { publicKey, fileName, contentType, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata, tags }: BaseOptions): Promise<BaseResponse>;
184
187
  export declare enum TypeEnum {
185
188
  Token = "token",
186
189
  FileInfo = "file_info"
@@ -309,6 +312,7 @@ export type MultipartStartOptions = {
309
312
  retryThrottledRequestMaxTimes?: number;
310
313
  retryNetworkErrorMaxTimes?: number;
311
314
  metadata?: Metadata;
315
+ tags?: Tags;
312
316
  };
313
317
  export type MultipartPart = string;
314
318
  export type MultipartStartResponse = {
@@ -316,7 +320,7 @@ export type MultipartStartResponse = {
316
320
  uuid: Uuid;
317
321
  };
318
322
  /** Start multipart uploading. */
319
- export function multipartStart(size: number, { publicKey, contentType, fileName, multipartChunkSize, baseURL, secureSignature, secureExpire, store, signal, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata }: MultipartStartOptions): Promise<MultipartStartResponse>;
323
+ export function multipartStart(size: number, { publicKey, contentType, fileName, multipartChunkSize, baseURL, secureSignature, secureExpire, store, signal, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata, tags }: MultipartStartOptions): Promise<MultipartStartResponse>;
320
324
  export type MultipartUploadOptions = {
321
325
  publicKey?: string;
322
326
  contentType?: string;
@@ -357,6 +361,7 @@ export declare class UploadcareFile {
357
361
  readonly videoInfo: VideoInfo | null;
358
362
  readonly contentInfo: ContentInfo | null;
359
363
  readonly metadata: Metadata | null;
364
+ readonly tags: Tags | null;
360
365
  readonly s3Bucket: string | null;
361
366
  readonly defaultEffects: null | string;
362
367
  constructor(fileInfo: FileInfo | GroupFileInfo, { baseCDN, fileName }?: {
@@ -387,9 +392,10 @@ export type FileFromOptions = {
387
392
  saveUrlForRecurrentUploads?: boolean;
388
393
  pusherKey?: string;
389
394
  metadata?: Metadata;
395
+ tags?: Tags;
390
396
  };
391
397
  /** Uploads file from provided data. */
392
- export declare function uploadFile(data: SupportedFileInput | 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>;
398
+ export declare function uploadFile(data: SupportedFileInput | Url | Uuid, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartMinFileSize, multipartChunkSize, maxConcurrentRequests, baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, pusherKey, metadata, tags }: FileFromOptions): Promise<UploadcareFile>;
393
399
  export type DirectOptions = {
394
400
  publicKey: string;
395
401
  fileName?: string;
@@ -407,8 +413,9 @@ export type DirectOptions = {
407
413
  retryNetworkErrorMaxTimes?: number;
408
414
  baseCDN?: string;
409
415
  metadata?: Metadata;
416
+ tags?: Tags;
410
417
  };
411
- export declare const uploadDirect: (file: SupportedFileInput, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }: DirectOptions) => Promise<UploadcareFile>;
418
+ export declare const uploadDirect: (file: SupportedFileInput, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata, tags }: DirectOptions) => Promise<UploadcareFile>;
412
419
  export type FromUploadedOptions = {
413
420
  publicKey: string;
414
421
  fileName?: string;
@@ -449,8 +456,9 @@ export type MultipartOptions = {
449
456
  maxConcurrentRequests?: number;
450
457
  baseCDN?: string;
451
458
  metadata?: Metadata;
459
+ tags?: Tags;
452
460
  };
453
- export declare const uploadMultipart: (file: SupportedFileInput, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, maxConcurrentRequests, baseCDN, metadata }: MultipartOptions) => Promise<UploadcareFile>;
461
+ export declare const uploadMultipart: (file: SupportedFileInput, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, maxConcurrentRequests, baseCDN, metadata, tags }: MultipartOptions) => Promise<UploadcareFile>;
454
462
  export declare class UploadcareGroup {
455
463
  readonly uuid: GroupId;
456
464
  readonly filesCount: string;
@@ -435,7 +435,7 @@ const getUrl = (base, path, query) => {
435
435
  return url.toString();
436
436
  };
437
437
 
438
- var version = '6.18.3';
438
+ var version = '6.18.4';
439
439
 
440
440
  const LIBRARY_NAME = 'UploadcareUploadClient';
441
441
  const LIBRARY_VERSION = version;
@@ -510,7 +510,7 @@ function getStoreValue(store) {
510
510
  * Performs file uploading request to Uploadcare Upload API. Can be canceled and
511
511
  * has progress.
512
512
  */
513
- function base(file, { publicKey, fileName, contentType, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata }) {
513
+ function base(file, { publicKey, fileName, contentType, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata, tags }) {
514
514
  return retryIfFailed(() => request({
515
515
  method: 'POST',
516
516
  url: getUrl(baseURL, '/base/', {
@@ -530,7 +530,8 @@ function base(file, { publicKey, fileName, contentType, baseURL = defaultSetting
530
530
  signature: secureSignature,
531
531
  expire: secureExpire,
532
532
  source: source,
533
- metadata
533
+ metadata,
534
+ tags: tags && tags.join(',')
534
535
  }),
535
536
  signal,
536
537
  onProgress
@@ -703,7 +704,7 @@ function info(uuid, { publicKey, baseURL = defaultSettings.baseURL, signal, sour
703
704
  }
704
705
 
705
706
  /** Start multipart uploading. */
706
- function multipartStart(size, { publicKey, contentType, fileName, multipartChunkSize = defaultSettings.multipartChunkSize, baseURL = '', secureSignature, secureExpire, store, signal, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata }) {
707
+ function multipartStart(size, { publicKey, contentType, fileName, multipartChunkSize = defaultSettings.multipartChunkSize, baseURL = '', secureSignature, secureExpire, store, signal, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata, tags }) {
707
708
  return retryIfFailed(() => request({
708
709
  method: 'POST',
709
710
  url: getUrl(baseURL, '/multipart/start/', { jsonerrors: 1 }),
@@ -720,7 +721,8 @@ function multipartStart(size, { publicKey, contentType, fileName, multipartChunk
720
721
  signature: secureSignature,
721
722
  expire: secureExpire,
722
723
  source: source,
723
- metadata
724
+ metadata,
725
+ tags: tags && tags.join(',')
724
726
  }),
725
727
  signal
726
728
  }).then(({ data, headers, request }) => {
@@ -802,9 +804,9 @@ function isReadyPoll(uuid, { publicKey, baseURL, source, integration, userAgent,
802
804
  retryNetworkErrorMaxTimes
803
805
  }).then((response) => {
804
806
  if (response.isReady) {
807
+ onProgress && onProgress({ isComputable: true, value: 1 });
805
808
  return response;
806
809
  }
807
- onProgress && onProgress({ isComputable: true, value: 1 });
808
810
  return false;
809
811
  }),
810
812
  signal
@@ -828,6 +830,7 @@ class UploadcareFile {
828
830
  videoInfo;
829
831
  contentInfo;
830
832
  metadata;
833
+ tags;
831
834
  s3Bucket;
832
835
  defaultEffects = null;
833
836
  constructor(fileInfo, { baseCDN = defaultSettings.baseCDN, fileName } = {}) {
@@ -848,6 +851,7 @@ class UploadcareFile {
848
851
  this.videoInfo = fileInfo.videoInfo;
849
852
  this.contentInfo = fileInfo.contentInfo;
850
853
  this.metadata = fileInfo.metadata || null;
854
+ this.tags = fileInfo.tags || null;
851
855
  this.s3Bucket = s3Bucket || null;
852
856
  this.s3Url = s3Url;
853
857
  if (isGroupFileInfo(fileInfo)) {
@@ -856,7 +860,7 @@ class UploadcareFile {
856
860
  }
857
861
  }
858
862
 
859
- const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }) => {
863
+ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata, tags }) => {
860
864
  return base(file, {
861
865
  publicKey,
862
866
  fileName,
@@ -872,7 +876,8 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
872
876
  userAgent,
873
877
  retryThrottledRequestMaxTimes,
874
878
  retryNetworkErrorMaxTimes,
875
- metadata
879
+ metadata,
880
+ tags
876
881
  })
877
882
  .then(({ file }) => {
878
883
  return isReadyPoll(file, {
@@ -891,26 +896,17 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
891
896
  };
892
897
 
893
898
  const uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN }) => {
894
- return info(uuid, {
899
+ return isReadyPoll(uuid, {
895
900
  publicKey,
896
901
  baseURL,
897
902
  signal,
903
+ onProgress,
898
904
  source,
899
905
  integration,
900
906
  userAgent,
901
907
  retryThrottledRequestMaxTimes,
902
908
  retryNetworkErrorMaxTimes
903
- })
904
- .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }))
905
- .then((result) => {
906
- // hack for node ¯\_(ツ)_/¯
907
- if (onProgress)
908
- onProgress({
909
- isComputable: true,
910
- value: 1
911
- });
912
- return result;
913
- });
909
+ }).then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }));
914
910
  };
915
911
 
916
912
  const race = (fns, { signal } = {}) => {
@@ -1238,15 +1234,20 @@ const uploadFromUrl = (sourceUrl, { publicKey, fileName, baseURL, baseCDN, check
1238
1234
  throw result;
1239
1235
  return result;
1240
1236
  })
1241
- .then((result) => isReadyPoll(result.uuid, {
1242
- publicKey,
1243
- baseURL,
1244
- integration,
1245
- userAgent,
1246
- retryThrottledRequestMaxTimes,
1247
- onProgress,
1248
- signal
1249
- }))
1237
+ .then((result) => {
1238
+ if (result.isReady) {
1239
+ return result;
1240
+ }
1241
+ return isReadyPoll(result.uuid, {
1242
+ publicKey,
1243
+ baseURL,
1244
+ integration,
1245
+ userAgent,
1246
+ retryThrottledRequestMaxTimes,
1247
+ onProgress,
1248
+ signal
1249
+ });
1250
+ })
1250
1251
  .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1251
1252
 
1252
1253
  const memo = new WeakMap();
@@ -1349,7 +1350,7 @@ const uploadPart = (chunk, url, { publicKey, contentType, onProgress, signal, in
1349
1350
  retryThrottledRequestMaxTimes,
1350
1351
  retryNetworkErrorMaxTimes
1351
1352
  });
1352
- 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 }) => {
1353
+ 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, tags }) => {
1353
1354
  const size = fileSize ?? (await getFileSize(file));
1354
1355
  let progressValues;
1355
1356
  const createProgressHandler = (totalChunks, chunkIdx) => {
@@ -1386,6 +1387,7 @@ const uploadMultipart = async (file, { publicKey, fileName, fileSize, baseURL, s
1386
1387
  retryThrottledRequestMaxTimes,
1387
1388
  retryNetworkErrorMaxTimes,
1388
1389
  metadata,
1390
+ tags,
1389
1391
  multipartChunkSize
1390
1392
  })
1391
1393
  .then(async ({ uuid, parts }) => {
@@ -1416,25 +1418,23 @@ const uploadMultipart = async (file, { publicKey, fileName, fileSize, baseURL, s
1416
1418
  if (fileInfo.isReady) {
1417
1419
  return fileInfo;
1418
1420
  }
1419
- else {
1420
- return isReadyPoll(fileInfo.uuid, {
1421
- publicKey,
1422
- baseURL,
1423
- source,
1424
- integration,
1425
- userAgent,
1426
- retryThrottledRequestMaxTimes,
1427
- retryNetworkErrorMaxTimes,
1428
- onProgress,
1429
- signal
1430
- });
1431
- }
1421
+ return isReadyPoll(fileInfo.uuid, {
1422
+ publicKey,
1423
+ baseURL,
1424
+ source,
1425
+ integration,
1426
+ userAgent,
1427
+ retryThrottledRequestMaxTimes,
1428
+ retryNetworkErrorMaxTimes,
1429
+ onProgress,
1430
+ signal
1431
+ });
1432
1432
  })
1433
1433
  .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1434
1434
  };
1435
1435
 
1436
1436
  /** Uploads file from provided data. */
1437
- 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 }) {
1437
+ 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, tags }) {
1438
1438
  if (isFileData(data)) {
1439
1439
  const fileSize = await getFileSize(data);
1440
1440
  if (isMultipart(fileSize, multipartMinFileSize)) {
@@ -1457,7 +1457,8 @@ async function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings
1457
1457
  retryThrottledRequestMaxTimes,
1458
1458
  retryNetworkErrorMaxTimes,
1459
1459
  baseCDN,
1460
- metadata
1460
+ metadata,
1461
+ tags
1461
1462
  });
1462
1463
  }
1463
1464
  return uploadDirect(data, {
@@ -1476,7 +1477,8 @@ async function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings
1476
1477
  retryThrottledRequestMaxTimes,
1477
1478
  retryNetworkErrorMaxTimes,
1478
1479
  baseCDN,
1479
- metadata
1480
+ metadata,
1481
+ tags
1480
1482
  });
1481
1483
  }
1482
1484
  if (isUrl(data)) {
@@ -73,6 +73,7 @@ export type ContentInfo = {
73
73
  video?: VideoInfo;
74
74
  };
75
75
  export type Metadata = Record<string, string>;
76
+ export type Tags = string[];
76
77
  export type StoreValue = "auto" | boolean;
77
78
  export declare class CancelError extends UploadcareError {
78
79
  isCancel: boolean;
@@ -125,12 +126,13 @@ export type FileInfo = {
125
126
  mimeType: string;
126
127
  isImage: boolean;
127
128
  isStored: boolean;
128
- isReady: string;
129
+ isReady: boolean;
129
130
  imageInfo: ImageInfo | null;
130
131
  videoInfo: VideoInfo | null;
131
132
  contentInfo: ContentInfo | null;
132
133
  s3Bucket?: string;
133
134
  metadata?: Metadata;
135
+ tags?: Tags;
134
136
  };
135
137
  export type GroupFileInfo = FileInfo & {
136
138
  defaultEffects: string;
@@ -175,12 +177,13 @@ export type BaseOptions = {
175
177
  retryThrottledRequestMaxTimes?: number;
176
178
  retryNetworkErrorMaxTimes?: number;
177
179
  metadata?: Metadata;
180
+ tags?: Tags;
178
181
  };
179
182
  /**
180
183
  * Performs file uploading request to Uploadcare Upload API. Can be canceled and
181
184
  * has progress.
182
185
  */
183
- export function base(file: SupportedFileInput, { publicKey, fileName, contentType, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata }: BaseOptions): Promise<BaseResponse>;
186
+ export function base(file: SupportedFileInput, { publicKey, fileName, contentType, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata, tags }: BaseOptions): Promise<BaseResponse>;
184
187
  export declare enum TypeEnum {
185
188
  Token = "token",
186
189
  FileInfo = "file_info"
@@ -309,6 +312,7 @@ export type MultipartStartOptions = {
309
312
  retryThrottledRequestMaxTimes?: number;
310
313
  retryNetworkErrorMaxTimes?: number;
311
314
  metadata?: Metadata;
315
+ tags?: Tags;
312
316
  };
313
317
  export type MultipartPart = string;
314
318
  export type MultipartStartResponse = {
@@ -316,7 +320,7 @@ export type MultipartStartResponse = {
316
320
  uuid: Uuid;
317
321
  };
318
322
  /** Start multipart uploading. */
319
- export function multipartStart(size: number, { publicKey, contentType, fileName, multipartChunkSize, baseURL, secureSignature, secureExpire, store, signal, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata }: MultipartStartOptions): Promise<MultipartStartResponse>;
323
+ export function multipartStart(size: number, { publicKey, contentType, fileName, multipartChunkSize, baseURL, secureSignature, secureExpire, store, signal, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, metadata, tags }: MultipartStartOptions): Promise<MultipartStartResponse>;
320
324
  export type MultipartUploadOptions = {
321
325
  publicKey?: string;
322
326
  contentType?: string;
@@ -357,6 +361,7 @@ export declare class UploadcareFile {
357
361
  readonly videoInfo: VideoInfo | null;
358
362
  readonly contentInfo: ContentInfo | null;
359
363
  readonly metadata: Metadata | null;
364
+ readonly tags: Tags | null;
360
365
  readonly s3Bucket: string | null;
361
366
  readonly defaultEffects: null | string;
362
367
  constructor(fileInfo: FileInfo | GroupFileInfo, { baseCDN, fileName }?: {
@@ -387,9 +392,10 @@ export type FileFromOptions = {
387
392
  saveUrlForRecurrentUploads?: boolean;
388
393
  pusherKey?: string;
389
394
  metadata?: Metadata;
395
+ tags?: Tags;
390
396
  };
391
397
  /** Uploads file from provided data. */
392
- export declare function uploadFile(data: SupportedFileInput | 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>;
398
+ export declare function uploadFile(data: SupportedFileInput | Url | Uuid, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartMinFileSize, multipartChunkSize, maxConcurrentRequests, baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, pusherKey, metadata, tags }: FileFromOptions): Promise<UploadcareFile>;
393
399
  export type DirectOptions = {
394
400
  publicKey: string;
395
401
  fileName?: string;
@@ -407,8 +413,9 @@ export type DirectOptions = {
407
413
  retryNetworkErrorMaxTimes?: number;
408
414
  baseCDN?: string;
409
415
  metadata?: Metadata;
416
+ tags?: Tags;
410
417
  };
411
- export declare const uploadDirect: (file: SupportedFileInput, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }: DirectOptions) => Promise<UploadcareFile>;
418
+ export declare const uploadDirect: (file: SupportedFileInput, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata, tags }: DirectOptions) => Promise<UploadcareFile>;
412
419
  export type FromUploadedOptions = {
413
420
  publicKey: string;
414
421
  fileName?: string;
@@ -449,8 +456,9 @@ export type MultipartOptions = {
449
456
  maxConcurrentRequests?: number;
450
457
  baseCDN?: string;
451
458
  metadata?: Metadata;
459
+ tags?: Tags;
452
460
  };
453
- export declare const uploadMultipart: (file: SupportedFileInput, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, maxConcurrentRequests, baseCDN, metadata }: MultipartOptions) => Promise<UploadcareFile>;
461
+ export declare const uploadMultipart: (file: SupportedFileInput, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize, maxConcurrentRequests, baseCDN, metadata, tags }: MultipartOptions) => Promise<UploadcareFile>;
454
462
  export declare class UploadcareGroup {
455
463
  readonly uuid: GroupId;
456
464
  readonly filesCount: string;