@uploadcare/upload-client 4.3.1-alpha.0 → 5.1.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.
@@ -255,7 +255,7 @@ const buildSearchParams = (query) => {
255
255
  };
256
256
  const getUrl = (base, path, query) => {
257
257
  const url = new URL(base);
258
- url.pathname = path;
258
+ url.pathname = (url.pathname + path).replace('//', '/');
259
259
  if (query) {
260
260
  url.search = buildSearchParams(query);
261
261
  }
@@ -271,18 +271,18 @@ const defaultSettings = {
271
271
  baseURL: 'https://upload.uploadcare.com',
272
272
  maxContentLength: 50 * 1024 * 1024,
273
273
  retryThrottledRequestMaxTimes: 1,
274
+ retryNetworkErrorMaxTimes: 3,
274
275
  multipartMinFileSize: 25 * 1024 * 1024,
275
276
  multipartChunkSize: 5 * 1024 * 1024,
276
277
  multipartMinLastPartSize: 1024 * 1024,
277
278
  maxConcurrentRequests: 4,
278
- multipartMaxAttempts: 3,
279
279
  pollingTimeoutMilliseconds: 10000,
280
280
  pusherKey: '79ae88bd931ea68464d9'
281
281
  };
282
282
  const defaultContentType = 'application/octet-stream';
283
283
  const defaultFilename = 'original';
284
284
 
285
- var version = '4.3.1-alpha.0';
285
+ var version = '5.1.0';
286
286
 
287
287
  function isObject(o) {
288
288
  return Object.prototype.toString.call(o) === '[object Object]';
@@ -375,6 +375,16 @@ function retrier(fn, options = defaultOptions) {
375
375
  return runAttempt(fn);
376
376
  }
377
377
 
378
+ class UploadcareNetworkError extends Error {
379
+ constructor(progressEvent) {
380
+ super();
381
+ this.name = 'UploadcareNetworkError';
382
+ this.message = 'Network error';
383
+ Object.setPrototypeOf(this, UploadcareNetworkError.prototype);
384
+ this.originalProgressEvent = progressEvent;
385
+ }
386
+ }
387
+
378
388
  const LIBRARY_NAME = 'UploadcareUploadClient';
379
389
  const LIBRARY_VERSION = version;
380
390
  function getUserAgent(options) {
@@ -386,20 +396,26 @@ function getUserAgent(options) {
386
396
  }
387
397
 
388
398
  const REQUEST_WAS_THROTTLED_CODE = 'RequestThrottledError';
389
- const DEFAULT_RETRY_AFTER_TIMEOUT = 15000;
399
+ const DEFAULT_THROTTLED_TIMEOUT = 15000;
400
+ const DEFAULT_NETWORK_ERROR_TIMEOUT = 1000;
390
401
  function getTimeoutFromThrottledRequest(error) {
391
402
  const { headers } = error || {};
392
403
  return ((headers &&
393
404
  Number.parseInt(headers['x-throttle-wait-seconds']) * 1000) ||
394
- DEFAULT_RETRY_AFTER_TIMEOUT);
405
+ DEFAULT_THROTTLED_TIMEOUT);
395
406
  }
396
- function retryIfThrottled(fn, retryThrottledMaxTimes) {
407
+ function retryIfFailed(fn, options) {
408
+ const { retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes } = options;
397
409
  return retrier(({ attempt, retry }) => fn().catch((error) => {
398
410
  if ('response' in error &&
399
411
  error?.code === REQUEST_WAS_THROTTLED_CODE &&
400
- attempt < retryThrottledMaxTimes) {
412
+ attempt < retryThrottledRequestMaxTimes) {
401
413
  return retry(getTimeoutFromThrottledRequest(error));
402
414
  }
415
+ if (error instanceof UploadcareNetworkError &&
416
+ attempt < retryNetworkErrorMaxTimes) {
417
+ return retry((attempt + 1) * DEFAULT_NETWORK_ERROR_TIMEOUT);
418
+ }
403
419
  throw error;
404
420
  }));
405
421
  }
@@ -412,8 +428,8 @@ function getStoreValue(store) {
412
428
  * Performs file uploading request to Uploadcare Upload API.
413
429
  * Can be canceled and has progress.
414
430
  */
415
- function base(file, { publicKey, fileName, contentType, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, metadata }) {
416
- return retryIfThrottled(() => request({
431
+ 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 }) {
432
+ return retryIfFailed(() => request({
417
433
  method: 'POST',
418
434
  url: getUrl(baseURL, '/base/', {
419
435
  jsonerrors: 1
@@ -444,7 +460,7 @@ function base(file, { publicKey, fileName, contentType, baseURL = defaultSetting
444
460
  else {
445
461
  return response;
446
462
  }
447
- }), retryThrottledRequestMaxTimes);
463
+ }), { retryNetworkErrorMaxTimes, retryThrottledRequestMaxTimes });
448
464
  }
449
465
 
450
466
  var TypeEnum;
@@ -455,8 +471,8 @@ var TypeEnum;
455
471
  /**
456
472
  * Uploading files from URL.
457
473
  */
458
- function fromUrl(sourceUrl, { publicKey, baseURL = defaultSettings.baseURL, store, fileName, checkForUrlDuplicates, saveUrlForRecurrentUploads, secureSignature, secureExpire, source = 'url', signal, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, metadata }) {
459
- return retryIfThrottled(() => request({
474
+ function fromUrl(sourceUrl, { publicKey, baseURL = defaultSettings.baseURL, store, fileName, checkForUrlDuplicates, saveUrlForRecurrentUploads, secureSignature, secureExpire, source = 'url', signal, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes, metadata }) {
475
+ return retryIfFailed(() => request({
460
476
  method: 'POST',
461
477
  headers: {
462
478
  'X-UC-User-Agent': getUserAgent({ publicKey, integration, userAgent })
@@ -483,7 +499,7 @@ function fromUrl(sourceUrl, { publicKey, baseURL = defaultSettings.baseURL, stor
483
499
  else {
484
500
  return response;
485
501
  }
486
- }), retryThrottledRequestMaxTimes);
502
+ }), { retryNetworkErrorMaxTimes, retryThrottledRequestMaxTimes });
487
503
  }
488
504
 
489
505
  var Status;
@@ -500,8 +516,8 @@ const isErrorResponse = (response) => {
500
516
  /**
501
517
  * Checking upload status and working with file tokens.
502
518
  */
503
- function fromUrlStatus(token, { publicKey, baseURL = defaultSettings.baseURL, signal, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes } = {}) {
504
- return retryIfThrottled(() => request({
519
+ function fromUrlStatus(token, { publicKey, baseURL = defaultSettings.baseURL, signal, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes } = {}) {
520
+ return retryIfFailed(() => request({
505
521
  method: 'GET',
506
522
  headers: publicKey
507
523
  ? {
@@ -525,14 +541,14 @@ function fromUrlStatus(token, { publicKey, baseURL = defaultSettings.baseURL, si
525
541
  else {
526
542
  return response;
527
543
  }
528
- }), retryThrottledRequestMaxTimes);
544
+ }), { retryNetworkErrorMaxTimes, retryThrottledRequestMaxTimes });
529
545
  }
530
546
 
531
547
  /**
532
548
  * Create files group.
533
549
  */
534
- function group(uuids, { publicKey, baseURL = defaultSettings.baseURL, jsonpCallback, secureSignature, secureExpire, signal, source, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes }) {
535
- return retryIfThrottled(() => request({
550
+ function group(uuids, { publicKey, baseURL = defaultSettings.baseURL, jsonpCallback, secureSignature, secureExpire, signal, source, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes }) {
551
+ return retryIfFailed(() => request({
536
552
  method: 'POST',
537
553
  headers: {
538
554
  'X-UC-User-Agent': getUserAgent({ publicKey, integration, userAgent })
@@ -555,14 +571,14 @@ function group(uuids, { publicKey, baseURL = defaultSettings.baseURL, jsonpCallb
555
571
  else {
556
572
  return response;
557
573
  }
558
- }), retryThrottledRequestMaxTimes);
574
+ }), { retryNetworkErrorMaxTimes, retryThrottledRequestMaxTimes });
559
575
  }
560
576
 
561
577
  /**
562
578
  * Get info about group.
563
579
  */
564
- function groupInfo(id, { publicKey, baseURL = defaultSettings.baseURL, signal, source, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes }) {
565
- return retryIfThrottled(() => request({
580
+ function groupInfo(id, { publicKey, baseURL = defaultSettings.baseURL, signal, source, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes }) {
581
+ return retryIfFailed(() => request({
566
582
  method: 'GET',
567
583
  headers: {
568
584
  'X-UC-User-Agent': getUserAgent({ publicKey, integration, userAgent })
@@ -582,14 +598,14 @@ function groupInfo(id, { publicKey, baseURL = defaultSettings.baseURL, signal, s
582
598
  else {
583
599
  return response;
584
600
  }
585
- }), retryThrottledRequestMaxTimes);
601
+ }), { retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes });
586
602
  }
587
603
 
588
604
  /**
589
605
  * Returns a JSON dictionary holding file info.
590
606
  */
591
- function info(uuid, { publicKey, baseURL = defaultSettings.baseURL, signal, source, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes }) {
592
- return retryIfThrottled(() => request({
607
+ function info(uuid, { publicKey, baseURL = defaultSettings.baseURL, signal, source, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes }) {
608
+ return retryIfFailed(() => request({
593
609
  method: 'GET',
594
610
  headers: {
595
611
  'X-UC-User-Agent': getUserAgent({ publicKey, integration, userAgent })
@@ -609,14 +625,14 @@ function info(uuid, { publicKey, baseURL = defaultSettings.baseURL, signal, sour
609
625
  else {
610
626
  return response;
611
627
  }
612
- }), retryThrottledRequestMaxTimes);
628
+ }), { retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes });
613
629
  }
614
630
 
615
631
  /**
616
632
  * Start multipart uploading.
617
633
  */
618
- function multipartStart(size, { publicKey, contentType, fileName, multipartChunkSize = defaultSettings.multipartChunkSize, baseURL = '', secureSignature, secureExpire, store, signal, source = 'local', integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, metadata }) {
619
- return retryIfThrottled(() => request({
634
+ 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 }) {
635
+ return retryIfFailed(() => request({
620
636
  method: 'POST',
621
637
  url: getUrl(baseURL, '/multipart/start/', { jsonerrors: 1 }),
622
638
  headers: {
@@ -645,14 +661,14 @@ function multipartStart(size, { publicKey, contentType, fileName, multipartChunk
645
661
  response.parts = Object.keys(response.parts).map((key) => response.parts[key]);
646
662
  return response;
647
663
  }
648
- }), retryThrottledRequestMaxTimes);
664
+ }), { retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes });
649
665
  }
650
666
 
651
667
  /**
652
668
  * Complete multipart uploading.
653
669
  */
654
- function multipartUpload(part, url, { signal, onProgress }) {
655
- return request({
670
+ function multipartUpload(part, url, { signal, onProgress, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes }) {
671
+ return retryIfFailed(() => request({
656
672
  method: 'PUT',
657
673
  url,
658
674
  data: part,
@@ -669,14 +685,17 @@ function multipartUpload(part, url, { signal, onProgress }) {
669
685
  });
670
686
  return result;
671
687
  })
672
- .then(({ status }) => ({ code: status }));
688
+ .then(({ status }) => ({ code: status })), {
689
+ retryThrottledRequestMaxTimes,
690
+ retryNetworkErrorMaxTimes
691
+ });
673
692
  }
674
693
 
675
694
  /**
676
695
  * Complete multipart uploading.
677
696
  */
678
- function multipartComplete(uuid, { publicKey, baseURL = defaultSettings.baseURL, source = 'local', signal, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes }) {
679
- return retryIfThrottled(() => request({
697
+ function multipartComplete(uuid, { publicKey, baseURL = defaultSettings.baseURL, source = 'local', signal, integration, userAgent, retryThrottledRequestMaxTimes = defaultSettings.retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes = defaultSettings.retryNetworkErrorMaxTimes }) {
698
+ return retryIfFailed(() => request({
680
699
  method: 'POST',
681
700
  url: getUrl(baseURL, '/multipart/complete/', { jsonerrors: 1 }),
682
701
  headers: {
@@ -696,7 +715,7 @@ function multipartComplete(uuid, { publicKey, baseURL = defaultSettings.baseURL,
696
715
  else {
697
716
  return response;
698
717
  }
699
- }), retryThrottledRequestMaxTimes);
718
+ }), { retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes });
700
719
  }
701
720
 
702
721
  class UploadcareFile {
@@ -763,7 +782,7 @@ const poll = ({ check, interval = DEFAULT_INTERVAL, signal }) => new Promise((re
763
782
  timeoutId = setTimeout(tick, 0);
764
783
  });
765
784
 
766
- function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent, retryThrottledRequestMaxTimes, signal, onProgress }) {
785
+ function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, signal, onProgress }) {
767
786
  return poll({
768
787
  check: (signal) => info(file, {
769
788
  publicKey,
@@ -772,7 +791,8 @@ function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent,
772
791
  source,
773
792
  integration,
774
793
  userAgent,
775
- retryThrottledRequestMaxTimes
794
+ retryThrottledRequestMaxTimes,
795
+ retryNetworkErrorMaxTimes
776
796
  }).then((response) => {
777
797
  if (response.isReady) {
778
798
  return response;
@@ -784,7 +804,7 @@ function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent,
784
804
  });
785
805
  }
786
806
 
787
- const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, baseCDN, metadata }) => {
807
+ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, secureExpire, store, contentType, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN, metadata }) => {
788
808
  return base(file, {
789
809
  publicKey,
790
810
  fileName,
@@ -799,6 +819,7 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
799
819
  integration,
800
820
  userAgent,
801
821
  retryThrottledRequestMaxTimes,
822
+ retryNetworkErrorMaxTimes,
802
823
  metadata
803
824
  })
804
825
  .then(({ file }) => {
@@ -810,6 +831,7 @@ const uploadDirect = (file, { publicKey, fileName, baseURL, secureSignature, sec
810
831
  integration,
811
832
  userAgent,
812
833
  retryThrottledRequestMaxTimes,
834
+ retryNetworkErrorMaxTimes,
813
835
  onProgress,
814
836
  signal
815
837
  });
@@ -995,7 +1017,7 @@ const preconnect = (key) => {
995
1017
  getPusher(key).connect();
996
1018
  };
997
1019
 
998
- function pollStrategy({ token, publicKey, baseURL, integration, userAgent, retryThrottledRequestMaxTimes, onProgress, signal }) {
1020
+ function pollStrategy({ token, publicKey, baseURL, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, onProgress, signal }) {
999
1021
  return poll({
1000
1022
  check: (signal) => fromUrlStatus(token, {
1001
1023
  publicKey,
@@ -1003,6 +1025,7 @@ function pollStrategy({ token, publicKey, baseURL, integration, userAgent, retry
1003
1025
  integration,
1004
1026
  userAgent,
1005
1027
  retryThrottledRequestMaxTimes,
1028
+ retryNetworkErrorMaxTimes,
1006
1029
  signal
1007
1030
  }).then((response) => {
1008
1031
  switch (response.status) {
@@ -1153,7 +1176,7 @@ const uploadFromUrl = (sourceUrl, { publicKey, fileName, baseURL, baseCDN, check
1153
1176
  }))
1154
1177
  .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1155
1178
 
1156
- const uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, baseCDN }) => {
1179
+ const uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, baseCDN }) => {
1157
1180
  return info(uuid, {
1158
1181
  publicKey,
1159
1182
  baseURL,
@@ -1161,7 +1184,8 @@ const uploadFromUploaded = (uuid, { publicKey, fileName, baseURL, signal, onProg
1161
1184
  source,
1162
1185
  integration,
1163
1186
  userAgent,
1164
- retryThrottledRequestMaxTimes
1187
+ retryThrottledRequestMaxTimes,
1188
+ retryNetworkErrorMaxTimes
1165
1189
  })
1166
1190
  .then((fileInfo) => new UploadcareFile(fileInfo, { baseCDN, fileName }))
1167
1191
  .then((result) => {
@@ -1233,18 +1257,15 @@ const runWithConcurrency = (concurrency, tasks) => {
1233
1257
  });
1234
1258
  };
1235
1259
 
1236
- const uploadPartWithRetry = (chunk, url, { publicKey, onProgress, signal, integration, multipartMaxAttempts }) => retrier(({ attempt, retry }) => multipartUpload(chunk, url, {
1260
+ const uploadPart = (chunk, url, { publicKey, onProgress, signal, integration, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes }) => multipartUpload(chunk, url, {
1237
1261
  publicKey,
1238
1262
  onProgress,
1239
1263
  signal,
1240
- integration
1241
- }).catch((error) => {
1242
- if (attempt < multipartMaxAttempts) {
1243
- return retry();
1244
- }
1245
- throw error;
1246
- }));
1247
- const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, contentType, multipartChunkSize = defaultSettings.multipartChunkSize, maxConcurrentRequests = defaultSettings.maxConcurrentRequests, multipartMaxAttempts = defaultSettings.multipartMaxAttempts, baseCDN, metadata }) => {
1264
+ integration,
1265
+ retryThrottledRequestMaxTimes,
1266
+ retryNetworkErrorMaxTimes
1267
+ });
1268
+ 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 }) => {
1248
1269
  const size = fileSize || getFileSize(file);
1249
1270
  let progressValues;
1250
1271
  const createProgressHandler = (totalChunks, chunkIdx) => {
@@ -1278,18 +1299,20 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
1278
1299
  integration,
1279
1300
  userAgent,
1280
1301
  retryThrottledRequestMaxTimes,
1302
+ retryNetworkErrorMaxTimes,
1281
1303
  metadata
1282
1304
  })
1283
1305
  .then(({ uuid, parts }) => {
1284
1306
  const getChunk = prepareChunks(file, size, multipartChunkSize);
1285
1307
  return Promise.all([
1286
1308
  uuid,
1287
- runWithConcurrency(maxConcurrentRequests, parts.map((url, index) => () => uploadPartWithRetry(getChunk(index), url, {
1309
+ runWithConcurrency(maxConcurrentRequests, parts.map((url, index) => () => uploadPart(getChunk(index), url, {
1288
1310
  publicKey,
1289
1311
  onProgress: createProgressHandler(parts.length, index),
1290
1312
  signal,
1291
1313
  integration,
1292
- multipartMaxAttempts
1314
+ retryThrottledRequestMaxTimes,
1315
+ retryNetworkErrorMaxTimes
1293
1316
  })))
1294
1317
  ]);
1295
1318
  })
@@ -1299,7 +1322,8 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
1299
1322
  source,
1300
1323
  integration,
1301
1324
  userAgent,
1302
- retryThrottledRequestMaxTimes
1325
+ retryThrottledRequestMaxTimes,
1326
+ retryNetworkErrorMaxTimes
1303
1327
  }))
1304
1328
  .then((fileInfo) => {
1305
1329
  if (fileInfo.isReady) {
@@ -1314,6 +1338,7 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
1314
1338
  integration,
1315
1339
  userAgent,
1316
1340
  retryThrottledRequestMaxTimes,
1341
+ retryNetworkErrorMaxTimes,
1317
1342
  onProgress,
1318
1343
  signal
1319
1344
  });
@@ -1325,7 +1350,7 @@ const uploadMultipart = (file, { publicKey, fileName, fileSize, baseURL, secureS
1325
1350
  /**
1326
1351
  * Uploads file from provided data.
1327
1352
  */
1328
- function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, contentType, multipartMinFileSize, multipartChunkSize, multipartMaxAttempts, maxConcurrentRequests, baseCDN = defaultSettings.baseCDN, checkForUrlDuplicates, saveUrlForRecurrentUploads, pusherKey, metadata }) {
1353
+ 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 }) {
1329
1354
  if (isFileData(data)) {
1330
1355
  const fileSize = getFileSize(data);
1331
1356
  if (isMultipart(fileSize, multipartMinFileSize)) {
@@ -1333,7 +1358,6 @@ function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseU
1333
1358
  publicKey,
1334
1359
  contentType,
1335
1360
  multipartChunkSize,
1336
- multipartMaxAttempts,
1337
1361
  fileName,
1338
1362
  baseURL,
1339
1363
  secureSignature,
@@ -1346,6 +1370,7 @@ function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseU
1346
1370
  userAgent,
1347
1371
  maxConcurrentRequests,
1348
1372
  retryThrottledRequestMaxTimes,
1373
+ retryNetworkErrorMaxTimes,
1349
1374
  baseCDN,
1350
1375
  metadata
1351
1376
  });
@@ -1364,6 +1389,7 @@ function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseU
1364
1389
  integration,
1365
1390
  userAgent,
1366
1391
  retryThrottledRequestMaxTimes,
1392
+ retryNetworkErrorMaxTimes,
1367
1393
  baseCDN,
1368
1394
  metadata
1369
1395
  });
@@ -1385,6 +1411,7 @@ function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseU
1385
1411
  integration,
1386
1412
  userAgent,
1387
1413
  retryThrottledRequestMaxTimes,
1414
+ retryNetworkErrorMaxTimes,
1388
1415
  pusherKey,
1389
1416
  metadata
1390
1417
  });
@@ -1400,6 +1427,7 @@ function uploadFile(data, { publicKey, fileName, baseURL = defaultSettings.baseU
1400
1427
  integration,
1401
1428
  userAgent,
1402
1429
  retryThrottledRequestMaxTimes,
1430
+ retryNetworkErrorMaxTimes,
1403
1431
  baseCDN
1404
1432
  });
1405
1433
  }
@@ -1455,7 +1483,7 @@ const isUrlArray = (data) => {
1455
1483
  return true;
1456
1484
  };
1457
1485
 
1458
- function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, contentType, multipartChunkSize = defaultSettings.multipartChunkSize, baseCDN = defaultSettings.baseCDN, jsonpCallback }) {
1486
+ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.baseURL, secureSignature, secureExpire, store, signal, onProgress, source, integration, userAgent, retryThrottledRequestMaxTimes, retryNetworkErrorMaxTimes, contentType, multipartChunkSize = defaultSettings.multipartChunkSize, baseCDN = defaultSettings.baseCDN, jsonpCallback }) {
1459
1487
  if (!isFileDataArray(data) && !isUrlArray(data) && !isUuidArray(data)) {
1460
1488
  throw new TypeError(`Group uploading from "${data}" is not supported`);
1461
1489
  }
@@ -1492,6 +1520,7 @@ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.
1492
1520
  integration,
1493
1521
  userAgent,
1494
1522
  retryThrottledRequestMaxTimes,
1523
+ retryNetworkErrorMaxTimes,
1495
1524
  contentType,
1496
1525
  multipartChunkSize,
1497
1526
  baseCDN
@@ -1507,7 +1536,8 @@ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.
1507
1536
  source,
1508
1537
  integration,
1509
1538
  userAgent,
1510
- retryThrottledRequestMaxTimes
1539
+ retryThrottledRequestMaxTimes,
1540
+ retryNetworkErrorMaxTimes
1511
1541
  })
1512
1542
  .then((groupInfo) => new UploadcareGroup(groupInfo, files))
1513
1543
  .then((group) => {
@@ -1580,4 +1610,4 @@ class UploadClient {
1580
1610
  }
1581
1611
  }
1582
1612
 
1583
- export { UploadClient, UploadClientError, UploadcareFile, UploadcareGroup, base, fromUrl, fromUrlStatus, getUserAgent$1 as getUserAgent, group, groupInfo, info, multipartComplete, multipartStart, multipartUpload, uploadDirect, uploadFile, uploadFileGroup, uploadFromUploaded, uploadFromUrl, uploadMultipart };
1613
+ export { UploadClient, UploadClientError, UploadcareFile, UploadcareGroup, UploadcareNetworkError, base, fromUrl, fromUrlStatus, getUserAgent$1 as getUserAgent, group, groupInfo, info, multipartComplete, multipartStart, multipartUpload, uploadDirect, uploadFile, uploadFileGroup, uploadFromUploaded, uploadFromUrl, uploadMultipart };