@ammarahmed/react-native-upload 6.33.0 → 7.0.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/dist/index.js CHANGED
@@ -1,3 +1,14 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
13
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
14
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -37,7 +48,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
48
  /**
38
49
  * Handles HTTP background file uploads from an iOS or Android device.
39
50
  */
40
- import { NativeModules, DeviceEventEmitter, Platform, } from 'react-native';
51
+ import { AppRegistry, NativeModules, DeviceEventEmitter, Platform, } from 'react-native';
41
52
  var NativeModule = NativeModules.RNFileUploader;
42
53
  var eventPrefix = 'RNFileUploader-';
43
54
  // for IOS, register event listeners or else they don't fire on DeviceEventEmitter
@@ -46,6 +57,68 @@ if (NativeModules.RNFileUploader && NativeModule.addListener) {
46
57
  NativeModule.addListener(eventPrefix + 'error');
47
58
  NativeModule.addListener(eventPrefix + 'cancelled');
48
59
  NativeModule.addListener(eventPrefix + 'completed');
60
+ NativeModule.addListener(eventPrefix + 'multipart-progress');
61
+ NativeModule.addListener(eventPrefix + 'multipart-error');
62
+ NativeModule.addListener(eventPrefix + 'multipart-cancelled');
63
+ NativeModule.addListener(eventPrefix + 'multipart-completed');
64
+ }
65
+ var multipartCompletionHandler = null;
66
+ var runningCompletions = new Map();
67
+ var runMultipartCompletion = function (event) {
68
+ var running = runningCompletions.get(event.uploadId);
69
+ if (running) {
70
+ return running;
71
+ }
72
+ var handler = multipartCompletionHandler;
73
+ if (!handler) {
74
+ return Promise.resolve();
75
+ }
76
+ var run = (function () { return __awaiter(void 0, void 0, void 0, function () {
77
+ var error_1;
78
+ return __generator(this, function (_a) {
79
+ switch (_a.label) {
80
+ case 0:
81
+ _a.trys.push([0, 3, 4, 5]);
82
+ return [4 /*yield*/, handler(event)];
83
+ case 1:
84
+ _a.sent();
85
+ return [4 /*yield*/, NativeModule.acknowledgeMultipartUpload(event.uploadId)];
86
+ case 2:
87
+ _a.sent();
88
+ return [3 /*break*/, 5];
89
+ case 3:
90
+ error_1 = _a.sent();
91
+ console.warn("Multipart completion handler failed for ".concat(event.uploadId), error_1);
92
+ return [3 /*break*/, 5];
93
+ case 4:
94
+ runningCompletions.delete(event.uploadId);
95
+ return [7 /*endfinally*/];
96
+ case 5: return [2 /*return*/];
97
+ }
98
+ });
99
+ }); })();
100
+ runningCompletions.set(event.uploadId, run);
101
+ return run;
102
+ };
103
+ DeviceEventEmitter.addListener(eventPrefix + 'multipart-completed', function (data) {
104
+ runMultipartCompletion({
105
+ uploadId: data.uploadId,
106
+ status: 'completed',
107
+ etags: data.etags || [],
108
+ error: null,
109
+ });
110
+ });
111
+ DeviceEventEmitter.addListener(eventPrefix + 'multipart-error', function (data) {
112
+ runMultipartCompletion({
113
+ uploadId: data.uploadId,
114
+ status: 'failed',
115
+ etags: data.etags || [],
116
+ error: data.error || null,
117
+ });
118
+ });
119
+ if (Platform.OS === 'android') {
120
+ AppRegistry.registerHeadlessTask('RNMultipartUploadKeepAlive', function () { return function () { return new Promise(function () { }); }; });
121
+ AppRegistry.registerHeadlessTask('RNMultipartUploadCompletion', function () { return function (data) { return runMultipartCompletion(data); }; });
49
122
  }
50
123
  export var UploadState = {
51
124
  Cancelled: 'cancelled',
@@ -146,6 +219,71 @@ var Upload = /** @class */ (function () {
146
219
  /**
147
220
  * Get all currently tracked uploads
148
221
  */
222
+ /**
223
+ * Create an S3 / Cloud multipart chunked upload instance
224
+ */
225
+ Upload.createMultipartS3 = function (options) {
226
+ return MultipartS3Upload.create(options);
227
+ };
228
+ /**
229
+ * Start an S3 / Cloud multipart chunked upload directly
230
+ */
231
+ Upload.startMultipartS3 = function (options) {
232
+ var upload = MultipartS3Upload.create(options);
233
+ return upload.start();
234
+ };
235
+ /**
236
+ * Cancel an ongoing S3 multipart upload
237
+ */
238
+ Upload.cancelMultipartS3 = function (uploadId) {
239
+ return MultipartS3Upload.cancel(uploadId);
240
+ };
241
+ /**
242
+ * Pause an ongoing S3 multipart upload
243
+ */
244
+ Upload.pauseMultipartS3 = function (uploadId) {
245
+ return MultipartS3Upload.pause(uploadId);
246
+ };
247
+ /**
248
+ * Resume a paused S3 multipart upload
249
+ */
250
+ Upload.resumeMultipartS3 = function (uploadId) {
251
+ return MultipartS3Upload.resume(uploadId);
252
+ };
253
+ /**
254
+ * Registers the function that finishes a multipart upload (for example by
255
+ * sending CompleteMultipartUpload) once every part has been uploaded. It is
256
+ * called when the app is running and, on Android, from a headless task when
257
+ * the upload finished while the app was not running. Register it at the top
258
+ * level of your entry file so it exists when the app is started in the
259
+ * background. The upload is acknowledged when the handler resolves.
260
+ */
261
+ Upload.setMultipartCompletionHandler = function (handler) {
262
+ multipartCompletionHandler = handler;
263
+ };
264
+ /**
265
+ * Lists multipart uploads known to the native side, including ones that
266
+ * finished while the app was suspended or relaunched in the background.
267
+ */
268
+ Upload.getMultipartS3Uploads = function () {
269
+ return NativeModule.getMultipartUploads();
270
+ };
271
+ /**
272
+ * Removes the stored state of a completed or failed multipart upload.
273
+ */
274
+ Upload.acknowledgeMultipartS3 = function (uploadId) {
275
+ return NativeModule.acknowledgeMultipartUpload(uploadId);
276
+ };
277
+ /**
278
+ * Add listener for multipart events
279
+ */
280
+ Upload.addMultipartListener = function (eventType, uploadId, listener) {
281
+ return DeviceEventEmitter.addListener(eventPrefix + "multipart-" + eventType, function (data) {
282
+ if (!uploadId || !data || data.uploadId === uploadId) {
283
+ listener(data);
284
+ }
285
+ });
286
+ };
149
287
  Upload.getAll = function () {
150
288
  var uploads = [];
151
289
  UploadRegistry.uploads.forEach(function (upload) { return uploads.push(upload); });
@@ -165,7 +303,7 @@ var Upload = /** @class */ (function () {
165
303
  */
166
304
  Upload.prototype.start = function () {
167
305
  return __awaiter(this, void 0, void 0, function () {
168
- var nativeUploads, existingUpload, _a, error_1;
306
+ var nativeUploads, existingUpload, _a, error_2;
169
307
  var _this = this;
170
308
  return __generator(this, function (_b) {
171
309
  switch (_b.label) {
@@ -208,12 +346,12 @@ var Upload = /** @class */ (function () {
208
346
  UploadRegistry.register(this);
209
347
  return [3 /*break*/, 6];
210
348
  case 5:
211
- error_1 = _b.sent();
349
+ error_2 = _b.sent();
212
350
  this.cleanup();
213
351
  if (this.rejectStart) {
214
- this.rejectStart(error_1);
352
+ this.rejectStart(error_2);
215
353
  }
216
- throw error_1;
354
+ throw error_2;
217
355
  case 6: return [2 /*return*/, this.startPromise];
218
356
  }
219
357
  });
@@ -304,7 +442,7 @@ var Upload = /** @class */ (function () {
304
442
  */
305
443
  Upload.prototype.cancel = function () {
306
444
  return __awaiter(this, void 0, void 0, function () {
307
- var result, error_2;
445
+ var result, error_3;
308
446
  return __generator(this, function (_a) {
309
447
  switch (_a.label) {
310
448
  case 0:
@@ -320,9 +458,9 @@ var Upload = /** @class */ (function () {
320
458
  // Don't cleanup here - let the cancelled event handle it
321
459
  return [2 /*return*/, result];
322
460
  case 3:
323
- error_2 = _a.sent();
461
+ error_3 = _a.sent();
324
462
  this.cleanup();
325
- throw error_2;
463
+ throw error_3;
326
464
  case 4: return [2 /*return*/];
327
465
  }
328
466
  });
@@ -364,6 +502,177 @@ var Upload = /** @class */ (function () {
364
502
  };
365
503
  return Upload;
366
504
  }());
505
+ var MultipartS3Upload = /** @class */ (function () {
506
+ function MultipartS3Upload(options) {
507
+ var _a;
508
+ this.subscriptions = [];
509
+ this.startPromise = null;
510
+ this.progressCallbacks = [];
511
+ this.options = __assign(__assign({}, options), { maxParallel: (_a = options.maxParallel) !== null && _a !== void 0 ? _a : 3 });
512
+ }
513
+ MultipartS3Upload.create = function (options) {
514
+ var existing = MultipartS3Upload.activeUploads.get(options.uploadId);
515
+ if (existing) {
516
+ return existing;
517
+ }
518
+ var upload = new MultipartS3Upload(options);
519
+ MultipartS3Upload.activeUploads.set(options.uploadId, upload);
520
+ return upload;
521
+ };
522
+ MultipartS3Upload.getById = function (uploadId) {
523
+ return MultipartS3Upload.activeUploads.get(uploadId);
524
+ };
525
+ MultipartS3Upload.cancel = function (uploadId) {
526
+ return __awaiter(this, void 0, void 0, function () {
527
+ var instance;
528
+ return __generator(this, function (_a) {
529
+ instance = MultipartS3Upload.activeUploads.get(uploadId);
530
+ if (instance) {
531
+ return [2 /*return*/, instance.cancel()];
532
+ }
533
+ return [2 /*return*/, NativeModule.cancelMultipartUpload(uploadId)];
534
+ });
535
+ });
536
+ };
537
+ MultipartS3Upload.pause = function (uploadId) {
538
+ return __awaiter(this, void 0, void 0, function () {
539
+ var instance;
540
+ return __generator(this, function (_a) {
541
+ instance = MultipartS3Upload.activeUploads.get(uploadId);
542
+ if (instance) {
543
+ return [2 /*return*/, instance.pause()];
544
+ }
545
+ return [2 /*return*/, NativeModule.pauseMultipartUpload(uploadId)];
546
+ });
547
+ });
548
+ };
549
+ MultipartS3Upload.resume = function (uploadId) {
550
+ return __awaiter(this, void 0, void 0, function () {
551
+ var instance;
552
+ return __generator(this, function (_a) {
553
+ instance = MultipartS3Upload.activeUploads.get(uploadId);
554
+ if (instance) {
555
+ return [2 /*return*/, instance.resume()];
556
+ }
557
+ return [2 /*return*/, NativeModule.resumeMultipartUpload(uploadId)];
558
+ });
559
+ });
560
+ };
561
+ MultipartS3Upload.prototype.onProgress = function (callback) {
562
+ if (!this.progressCallbacks.includes(callback)) {
563
+ this.progressCallbacks.push(callback);
564
+ }
565
+ return this;
566
+ };
567
+ MultipartS3Upload.prototype.getId = function () {
568
+ return this.options.uploadId;
569
+ };
570
+ MultipartS3Upload.prototype.getPath = function () {
571
+ return this.options.path;
572
+ };
573
+ MultipartS3Upload.prototype.start = function () {
574
+ return __awaiter(this, void 0, void 0, function () {
575
+ var _this = this;
576
+ return __generator(this, function (_a) {
577
+ if (this.startPromise) {
578
+ return [2 /*return*/, this.startPromise];
579
+ }
580
+ this.setupEventListeners();
581
+ this.startPromise = (function () { return __awaiter(_this, void 0, void 0, function () {
582
+ var nativeResult;
583
+ return __generator(this, function (_a) {
584
+ switch (_a.label) {
585
+ case 0:
586
+ _a.trys.push([0, , 2, 3]);
587
+ return [4 /*yield*/, NativeModule.startMultipartUpload(this.options)];
588
+ case 1:
589
+ nativeResult = _a.sent();
590
+ return [2 /*return*/, nativeResult];
591
+ case 2:
592
+ this.cleanup();
593
+ return [7 /*endfinally*/];
594
+ case 3: return [2 /*return*/];
595
+ }
596
+ });
597
+ }); })();
598
+ return [2 /*return*/, this.startPromise];
599
+ });
600
+ });
601
+ };
602
+ MultipartS3Upload.prototype.setupEventListeners = function () {
603
+ var _this = this;
604
+ var progressSub = DeviceEventEmitter.addListener(eventPrefix + "multipart-progress", function (data) {
605
+ if (data.uploadId === _this.options.uploadId) {
606
+ _this.progressCallbacks.forEach(function (cb) { return cb(data); });
607
+ }
608
+ });
609
+ this.subscriptions.push(progressSub);
610
+ };
611
+ MultipartS3Upload.prototype.cancel = function () {
612
+ return __awaiter(this, void 0, void 0, function () {
613
+ var res, err_1;
614
+ return __generator(this, function (_a) {
615
+ switch (_a.label) {
616
+ case 0:
617
+ _a.trys.push([0, 2, , 3]);
618
+ return [4 /*yield*/, NativeModule.cancelMultipartUpload(this.options.uploadId)];
619
+ case 1:
620
+ res = _a.sent();
621
+ this.cleanup();
622
+ return [2 /*return*/, res];
623
+ case 2:
624
+ err_1 = _a.sent();
625
+ this.cleanup();
626
+ throw err_1;
627
+ case 3: return [2 /*return*/];
628
+ }
629
+ });
630
+ });
631
+ };
632
+ MultipartS3Upload.prototype.pause = function () {
633
+ return __awaiter(this, void 0, void 0, function () {
634
+ return __generator(this, function (_a) {
635
+ return [2 /*return*/, NativeModule.pauseMultipartUpload(this.options.uploadId)];
636
+ });
637
+ });
638
+ };
639
+ MultipartS3Upload.prototype.resume = function () {
640
+ return __awaiter(this, void 0, void 0, function () {
641
+ return __generator(this, function (_a) {
642
+ return [2 /*return*/, NativeModule.resumeMultipartUpload(this.options.uploadId)];
643
+ });
644
+ });
645
+ };
646
+ MultipartS3Upload.prototype.cleanup = function () {
647
+ this.subscriptions.forEach(function (sub) { return sub.remove(); });
648
+ this.subscriptions = [];
649
+ MultipartS3Upload.activeUploads.delete(this.options.uploadId);
650
+ };
651
+ MultipartS3Upload.activeUploads = new Map();
652
+ return MultipartS3Upload;
653
+ }());
654
+ export var startMultipartS3 = function (options) {
655
+ return Upload.startMultipartS3(options);
656
+ };
657
+ export var cancelMultipartS3 = function (uploadId) {
658
+ return Upload.cancelMultipartS3(uploadId);
659
+ };
660
+ export var pauseMultipartS3 = function (uploadId) {
661
+ return Upload.pauseMultipartS3(uploadId);
662
+ };
663
+ export var resumeMultipartS3 = function (uploadId) {
664
+ return Upload.resumeMultipartS3(uploadId);
665
+ };
666
+ export var setMultipartCompletionHandler = function (handler) { return Upload.setMultipartCompletionHandler(handler); };
667
+ export var getMultipartS3Uploads = function () {
668
+ return Upload.getMultipartS3Uploads();
669
+ };
670
+ export var acknowledgeMultipartS3 = function (uploadId) {
671
+ return Upload.acknowledgeMultipartS3(uploadId);
672
+ };
673
+ export var addMultipartListener = function (eventType, uploadId, listener) {
674
+ return Upload.addMultipartListener(eventType, uploadId, listener);
675
+ };
367
676
  // Legacy API exports for backward compatibility
368
677
  export var getFileInfo = function (path) {
369
678
  return NativeModule.getFileInfo(path).then(function (data) {
@@ -408,5 +717,5 @@ export var getAllUploads = function () { return __awaiter(void 0, void 0, void 0
408
717
  }
409
718
  });
410
719
  }); };
411
- export { Upload };
720
+ export { Upload, MultipartS3Upload };
412
721
  export default Upload;
@@ -5,6 +5,7 @@
5
5
  #import <React/RCTEventEmitter.h>
6
6
 
7
7
  #import "RNFileUploader.h"
8
+ #import "RNMultipartUploader.h"
8
9
 
9
10
  @implementation RNFileUploader
10
11
 
@@ -44,11 +45,17 @@ BOOL limitNetwork = NO;
44
45
  - (NSArray<NSString *> *)supportedEvents {
45
46
  return @[
46
47
  @"RNFileUploader-progress", @"RNFileUploader-error",
47
- @"RNFileUploader-cancelled", @"RNFileUploader-completed"
48
+ @"RNFileUploader-cancelled", @"RNFileUploader-completed",
49
+ @"RNFileUploader-multipart-progress", @"RNFileUploader-multipart-error",
50
+ @"RNFileUploader-multipart-cancelled", @"RNFileUploader-multipart-completed"
48
51
  ];
49
52
  }
50
53
 
51
54
  - (void)startObserving {
55
+ [[RNMultipartUploader sharedInstance] setEventEmitter:^(NSString *eventName, id body) {
56
+ [self _sendEventWithName:eventName body:body];
57
+ }];
58
+ [[RNMultipartUploader sharedInstance] restore];
52
59
  // JS side is ready to receive events; create the background url session if
53
60
  // necessary iOS will then deliver the tasks completed while the app was
54
61
  // dead (if any)
@@ -65,6 +72,8 @@ BOOL limitNetwork = NO;
65
72
  completionHandler:(void (^)())completionHandler {
66
73
  if ([BACKGROUND_SESSION_ID isEqualToString:identifier]) {
67
74
  backgroundSessionCompletionHandler = completionHandler;
75
+ } else if ([[RNMultipartUploader sessionIdentifier] isEqualToString:identifier]) {
76
+ [[RNMultipartUploader sharedInstance] setBackgroundCompletionHandler:completionHandler];
68
77
  }
69
78
  }
70
79
 
@@ -316,6 +325,7 @@ RCT_EXPORT_METHOD(cancelUpload : (NSString *)cancelUploadId resolve : (
316
325
  }
317
326
 
318
327
  RCT_EXPORT_METHOD(canSuspendIfBackground) {
328
+ [[RNMultipartUploader sharedInstance] finishBackgroundEvents];
319
329
  if (backgroundSessionCompletionHandler) {
320
330
  backgroundSessionCompletionHandler();
321
331
  backgroundSessionCompletionHandler = nil;
@@ -576,4 +586,45 @@ RCT_EXPORT_METHOD(getAllUploads : (RCTPromiseResolveBlock)
576
586
  }
577
587
  }
578
588
 
589
+
590
+ RCT_EXPORT_METHOD(startMultipartUpload:(NSDictionary *)options
591
+ resolver:(RCTPromiseResolveBlock)resolve
592
+ rejecter:(RCTPromiseRejectBlock)reject) {
593
+ [[RNMultipartUploader sharedInstance] startUploadWithOptions:options
594
+ resolver:resolve
595
+ rejecter:reject];
596
+ }
597
+
598
+ RCT_EXPORT_METHOD(getMultipartUploads:(RCTPromiseResolveBlock)resolve
599
+ rejecter:(RCTPromiseRejectBlock)reject) {
600
+ resolve([[RNMultipartUploader sharedInstance] pendingUploads]);
601
+ }
602
+
603
+ RCT_EXPORT_METHOD(acknowledgeMultipartUpload:(NSString *)uploadId
604
+ resolver:(RCTPromiseResolveBlock)resolve
605
+ rejecter:(RCTPromiseRejectBlock)reject) {
606
+ resolve(@([[RNMultipartUploader sharedInstance] acknowledgeUpload:uploadId]));
607
+ }
608
+
609
+ RCT_EXPORT_METHOD(cancelMultipartUpload:(NSString *)uploadId
610
+ resolver:(RCTPromiseResolveBlock)resolve
611
+ rejecter:(RCTPromiseRejectBlock)reject) {
612
+ BOOL cancelled = [[RNMultipartUploader sharedInstance] cancelUpload:uploadId];
613
+ resolve(@(cancelled));
614
+ }
615
+
616
+ RCT_EXPORT_METHOD(pauseMultipartUpload:(NSString *)uploadId
617
+ resolver:(RCTPromiseResolveBlock)resolve
618
+ rejecter:(RCTPromiseRejectBlock)reject) {
619
+ BOOL paused = [[RNMultipartUploader sharedInstance] pauseUpload:uploadId];
620
+ resolve(@(paused));
621
+ }
622
+
623
+ RCT_EXPORT_METHOD(resumeMultipartUpload:(NSString *)uploadId
624
+ resolver:(RCTPromiseResolveBlock)resolve
625
+ rejecter:(RCTPromiseRejectBlock)reject) {
626
+ BOOL resumed = [[RNMultipartUploader sharedInstance] resumeUpload:uploadId];
627
+ resolve(@(resumed));
628
+ }
629
+
579
630
  @end
@@ -0,0 +1,28 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import <React/RCTBridgeModule.h>
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
6
+ @interface RNMultipartUploader : NSObject
7
+
8
+ + (instancetype)sharedInstance;
9
+ + (NSString *)sessionIdentifier;
10
+
11
+ - (void)setEventEmitter:(nullable void (^)(NSString *eventName, id body))eventEmitter;
12
+ - (void)restore;
13
+ - (void)setBackgroundCompletionHandler:(void (^)(void))completionHandler;
14
+ - (void)finishBackgroundEvents;
15
+
16
+ - (void)startUploadWithOptions:(NSDictionary *)options
17
+ resolver:(RCTPromiseResolveBlock)resolve
18
+ rejecter:(RCTPromiseRejectBlock)reject;
19
+
20
+ - (BOOL)cancelUpload:(NSString *)uploadId;
21
+ - (BOOL)pauseUpload:(NSString *)uploadId;
22
+ - (BOOL)resumeUpload:(NSString *)uploadId;
23
+ - (NSArray<NSDictionary *> *)pendingUploads;
24
+ - (BOOL)acknowledgeUpload:(NSString *)uploadId;
25
+
26
+ @end
27
+
28
+ NS_ASSUME_NONNULL_END