@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/.eslintignore +1 -2
- package/README.md +166 -1
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/appfolio/uploader/MultipartCompletionService.kt +33 -0
- package/android/src/main/java/com/appfolio/uploader/MultipartUploadService.kt +200 -0
- package/android/src/main/java/com/appfolio/uploader/MultipartUploader.kt +787 -0
- package/android/src/main/java/com/appfolio/uploader/UploaderModule.kt +76 -2
- package/dist/index.d.ts +161 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +318 -9
- package/ios/RNFileUploader.m +52 -1
- package/ios/RNMultipartUploader.h +28 -0
- package/ios/RNMultipartUploader.m +748 -0
- package/package.json +3 -3
- package/src/index.ts +404 -2
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,
|
|
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
|
-
|
|
349
|
+
error_2 = _b.sent();
|
|
212
350
|
this.cleanup();
|
|
213
351
|
if (this.rejectStart) {
|
|
214
|
-
this.rejectStart(
|
|
352
|
+
this.rejectStart(error_2);
|
|
215
353
|
}
|
|
216
|
-
throw
|
|
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,
|
|
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
|
-
|
|
461
|
+
error_3 = _a.sent();
|
|
324
462
|
this.cleanup();
|
|
325
|
-
throw
|
|
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;
|
package/ios/RNFileUploader.m
CHANGED
|
@@ -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
|