@ammarahmed/react-native-upload 6.32.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 +80 -24
- package/ios/RNMultipartUploader.h +28 -0
- package/ios/RNMultipartUploader.m +748 -0
- package/package.json +3 -3
- package/src/index.ts +404 -2
|
@@ -28,6 +28,7 @@ import net.gotev.uploadservice.protocols.multipart.MultipartUploadRequest
|
|
|
28
28
|
import okhttp3.OkHttpClient
|
|
29
29
|
import java.io.File
|
|
30
30
|
import java.util.concurrent.TimeUnit
|
|
31
|
+
import kotlinx.coroutines.*
|
|
31
32
|
|
|
32
33
|
class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), LifecycleEventListener {
|
|
33
34
|
private val TAG = "UploaderBridge"
|
|
@@ -399,12 +400,85 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
399
400
|
}
|
|
400
401
|
}
|
|
401
402
|
|
|
402
|
-
|
|
403
|
+
private val multipartUploader = MultipartUploader.getInstance(reactContext)
|
|
404
|
+
|
|
405
|
+
init {
|
|
406
|
+
multipartUploader.attachReactContext(reactContext)
|
|
403
407
|
}
|
|
408
|
+
private val moduleScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
|
|
404
409
|
|
|
405
|
-
|
|
410
|
+
@ReactMethod
|
|
411
|
+
fun startMultipartUpload(options: ReadableMap, promise: Promise) {
|
|
412
|
+
moduleScope.launch {
|
|
413
|
+
try {
|
|
414
|
+
val result = multipartUploader.startMultipartUpload(UploadParams.fromReadableMap(options))
|
|
415
|
+
promise.resolve(result)
|
|
416
|
+
} catch (e: CancellationException) {
|
|
417
|
+
promise.reject("CANCELLED", "Upload cancelled")
|
|
418
|
+
} catch (e: UploadAlreadyExistsException) {
|
|
419
|
+
promise.reject("ALREADY_EXISTS", e.message)
|
|
420
|
+
} catch (e: IllegalArgumentException) {
|
|
421
|
+
promise.reject("INVALID_ARGUMENT", e.message)
|
|
422
|
+
} catch (e: Throwable) {
|
|
423
|
+
promise.reject("MULTIPART_UPLOAD_ERROR", e.message, e)
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
@ReactMethod
|
|
429
|
+
fun cancelMultipartUpload(uploadId: String, promise: Promise) {
|
|
430
|
+
try {
|
|
431
|
+
val success = multipartUploader.cancelUpload(uploadId)
|
|
432
|
+
promise.resolve(success)
|
|
433
|
+
} catch (e: Exception) {
|
|
434
|
+
promise.reject("CANCEL_ERROR", e.message, e)
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
@ReactMethod
|
|
439
|
+
fun getMultipartUploads(promise: Promise) {
|
|
440
|
+
promise.resolve(multipartUploader.pendingUploads())
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
@ReactMethod
|
|
444
|
+
fun acknowledgeMultipartUpload(uploadId: String, promise: Promise) {
|
|
445
|
+
promise.resolve(multipartUploader.acknowledgeUpload(uploadId))
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
@ReactMethod
|
|
449
|
+
fun pauseMultipartUpload(uploadId: String, promise: Promise) {
|
|
450
|
+
try {
|
|
451
|
+
val success = multipartUploader.pauseUpload(uploadId)
|
|
452
|
+
promise.resolve(success)
|
|
453
|
+
} catch (e: Exception) {
|
|
454
|
+
promise.reject("PAUSE_ERROR", e.message, e)
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
@ReactMethod
|
|
459
|
+
fun resumeMultipartUpload(uploadId: String, promise: Promise) {
|
|
460
|
+
try {
|
|
461
|
+
val success = multipartUploader.resumeUpload(uploadId)
|
|
462
|
+
promise.resolve(success)
|
|
463
|
+
} catch (e: Exception) {
|
|
464
|
+
promise.reject("RESUME_ERROR", e.message, e)
|
|
465
|
+
}
|
|
406
466
|
}
|
|
407
467
|
|
|
408
468
|
override fun onHostDestroy() {
|
|
409
469
|
}
|
|
470
|
+
|
|
471
|
+
override fun invalidate() {
|
|
472
|
+
multipartUploader.detachReactContext(reactContext)
|
|
473
|
+
moduleScope.cancel()
|
|
474
|
+
super.invalidate()
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
override fun onHostResume() {
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
override fun onHostPause() {
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
|
|
410
484
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,9 +26,21 @@ export type NotificationOptions = {
|
|
|
26
26
|
*/
|
|
27
27
|
onProgressTitle: string;
|
|
28
28
|
/**
|
|
29
|
-
* Sets notification progress message { onProgressMessage: "Uploading new video" }
|
|
29
|
+
* Sets notification progress message. For multipart uploads {progress} is replaced with the percentage { onProgressMessage: "Uploading new video" }
|
|
30
30
|
*/
|
|
31
31
|
onProgressMessage: string;
|
|
32
|
+
/**
|
|
33
|
+
* Sets multipart upload notification start message { onStartMessage: "Starting upload..." }
|
|
34
|
+
*/
|
|
35
|
+
onStartMessage: string;
|
|
36
|
+
/**
|
|
37
|
+
* Sets multipart upload notification message when resuming { onResumeMessage: "Resuming upload..." }
|
|
38
|
+
*/
|
|
39
|
+
onResumeMessage: string;
|
|
40
|
+
/**
|
|
41
|
+
* Sets the Android notification channel name shown in system settings { notificationChannelName: "Uploads" }
|
|
42
|
+
*/
|
|
43
|
+
notificationChannelName: string;
|
|
32
44
|
/**
|
|
33
45
|
* Sets notification complete title { onCompleteTitle: "Upload finished" }
|
|
34
46
|
*/
|
|
@@ -106,6 +118,81 @@ export interface ErrorData extends CompletedData {
|
|
|
106
118
|
error: string;
|
|
107
119
|
}
|
|
108
120
|
export type UploadEventData = ProgressData | ErrorData | CancelledData | CompletedData;
|
|
121
|
+
export type MultipartEventType = "progress" | "error" | "completed" | "cancelled";
|
|
122
|
+
export interface MultipartS3Options {
|
|
123
|
+
/**
|
|
124
|
+
* Unique upload ID to track the upload.
|
|
125
|
+
*/
|
|
126
|
+
uploadId: string;
|
|
127
|
+
/**
|
|
128
|
+
* Path to the local file to upload (e.g. /path/to/file or file:///path/to/file).
|
|
129
|
+
*/
|
|
130
|
+
path: string;
|
|
131
|
+
/**
|
|
132
|
+
* Array of presigned URLs for each chunk in sequence.
|
|
133
|
+
*/
|
|
134
|
+
parts: string[];
|
|
135
|
+
/**
|
|
136
|
+
* Maximum parallel chunk uploads (default: 3).
|
|
137
|
+
*/
|
|
138
|
+
maxParallel?: number;
|
|
139
|
+
/**
|
|
140
|
+
* Notification options for background service (Android).
|
|
141
|
+
*/
|
|
142
|
+
notification?: Partial<NotificationOptions>;
|
|
143
|
+
/**
|
|
144
|
+
* AppGroup defined in Xcode for extensions (iOS).
|
|
145
|
+
*/
|
|
146
|
+
appGroup?: string;
|
|
147
|
+
/**
|
|
148
|
+
* Fixed-length array of previously uploaded chunk ETags (matching parts array length)
|
|
149
|
+
* for resuming an existing upload session. Completed parts carry their ETag string,
|
|
150
|
+
* while uncompleted parts carry empty string "".
|
|
151
|
+
* Already uploaded chunks will be skipped and pre-filled with these ETags.
|
|
152
|
+
*/
|
|
153
|
+
existingEtags?: string[];
|
|
154
|
+
/**
|
|
155
|
+
* Whether the upload can survive the app process being killed (default: true).
|
|
156
|
+
* Resumable uploads are persisted natively, resumed after a restart and can
|
|
157
|
+
* be finished later through getMultipartS3Uploads. When false, the upload
|
|
158
|
+
* still keeps running while the app is in the background but nothing is
|
|
159
|
+
* persisted, so it is gone if the app process dies.
|
|
160
|
+
*/
|
|
161
|
+
resumable?: boolean;
|
|
162
|
+
}
|
|
163
|
+
export interface MultipartProgressEvent {
|
|
164
|
+
type: string;
|
|
165
|
+
uploadId: string;
|
|
166
|
+
progress?: number;
|
|
167
|
+
bytesUploaded?: number;
|
|
168
|
+
totalBytes?: number;
|
|
169
|
+
chunkIndex?: number;
|
|
170
|
+
etag?: string;
|
|
171
|
+
etags?: string[];
|
|
172
|
+
errorMessage?: string;
|
|
173
|
+
}
|
|
174
|
+
export type MultipartUploadStatus = "running" | "paused" | "completed" | "failed";
|
|
175
|
+
export interface MultipartPendingUpload {
|
|
176
|
+
uploadId: string;
|
|
177
|
+
status: MultipartUploadStatus;
|
|
178
|
+
progress: number;
|
|
179
|
+
bytesUploaded: number;
|
|
180
|
+
totalBytes: number;
|
|
181
|
+
etags: string[];
|
|
182
|
+
error: string | null;
|
|
183
|
+
}
|
|
184
|
+
export interface MultipartCompletionEvent {
|
|
185
|
+
uploadId: string;
|
|
186
|
+
status: "completed" | "failed";
|
|
187
|
+
etags: string[];
|
|
188
|
+
error: string | null;
|
|
189
|
+
}
|
|
190
|
+
export type MultipartCompletionHandler = (event: MultipartCompletionEvent) => Promise<void> | void;
|
|
191
|
+
export interface MultipartS3Result {
|
|
192
|
+
uploadId: string;
|
|
193
|
+
success: boolean;
|
|
194
|
+
etags: string[];
|
|
195
|
+
}
|
|
109
196
|
export declare const UploadState: {
|
|
110
197
|
readonly Cancelled: "cancelled";
|
|
111
198
|
readonly Completed: "completed";
|
|
@@ -154,6 +241,48 @@ declare class Upload {
|
|
|
154
241
|
/**
|
|
155
242
|
* Get all currently tracked uploads
|
|
156
243
|
*/
|
|
244
|
+
/**
|
|
245
|
+
* Create an S3 / Cloud multipart chunked upload instance
|
|
246
|
+
*/
|
|
247
|
+
static createMultipartS3(options: MultipartS3Options): MultipartS3Upload;
|
|
248
|
+
/**
|
|
249
|
+
* Start an S3 / Cloud multipart chunked upload directly
|
|
250
|
+
*/
|
|
251
|
+
static startMultipartS3(options: MultipartS3Options): Promise<MultipartS3Result>;
|
|
252
|
+
/**
|
|
253
|
+
* Cancel an ongoing S3 multipart upload
|
|
254
|
+
*/
|
|
255
|
+
static cancelMultipartS3(uploadId: string): Promise<boolean>;
|
|
256
|
+
/**
|
|
257
|
+
* Pause an ongoing S3 multipart upload
|
|
258
|
+
*/
|
|
259
|
+
static pauseMultipartS3(uploadId: string): Promise<boolean>;
|
|
260
|
+
/**
|
|
261
|
+
* Resume a paused S3 multipart upload
|
|
262
|
+
*/
|
|
263
|
+
static resumeMultipartS3(uploadId: string): Promise<boolean>;
|
|
264
|
+
/**
|
|
265
|
+
* Registers the function that finishes a multipart upload (for example by
|
|
266
|
+
* sending CompleteMultipartUpload) once every part has been uploaded. It is
|
|
267
|
+
* called when the app is running and, on Android, from a headless task when
|
|
268
|
+
* the upload finished while the app was not running. Register it at the top
|
|
269
|
+
* level of your entry file so it exists when the app is started in the
|
|
270
|
+
* background. The upload is acknowledged when the handler resolves.
|
|
271
|
+
*/
|
|
272
|
+
static setMultipartCompletionHandler(handler: MultipartCompletionHandler | null): void;
|
|
273
|
+
/**
|
|
274
|
+
* Lists multipart uploads known to the native side, including ones that
|
|
275
|
+
* finished while the app was suspended or relaunched in the background.
|
|
276
|
+
*/
|
|
277
|
+
static getMultipartS3Uploads(): Promise<MultipartPendingUpload[]>;
|
|
278
|
+
/**
|
|
279
|
+
* Removes the stored state of a completed or failed multipart upload.
|
|
280
|
+
*/
|
|
281
|
+
static acknowledgeMultipartS3(uploadId: string): Promise<boolean>;
|
|
282
|
+
/**
|
|
283
|
+
* Add listener for multipart events
|
|
284
|
+
*/
|
|
285
|
+
static addMultipartListener(eventType: MultipartEventType, uploadId: string, listener: (data: any) => void): EmitterSubscription;
|
|
157
286
|
static getAll(): Upload[];
|
|
158
287
|
/**
|
|
159
288
|
* Set a callback to be called whenever the upload state changes
|
|
@@ -192,6 +321,36 @@ declare class Upload {
|
|
|
192
321
|
*/
|
|
193
322
|
private cleanup;
|
|
194
323
|
}
|
|
324
|
+
declare class MultipartS3Upload {
|
|
325
|
+
private options;
|
|
326
|
+
private subscriptions;
|
|
327
|
+
private startPromise;
|
|
328
|
+
private progressCallbacks;
|
|
329
|
+
private static activeUploads;
|
|
330
|
+
constructor(options: MultipartS3Options);
|
|
331
|
+
static create(options: MultipartS3Options): MultipartS3Upload;
|
|
332
|
+
static getById(uploadId: string): MultipartS3Upload | undefined;
|
|
333
|
+
static cancel(uploadId: string): Promise<boolean>;
|
|
334
|
+
static pause(uploadId: string): Promise<boolean>;
|
|
335
|
+
static resume(uploadId: string): Promise<boolean>;
|
|
336
|
+
onProgress(callback: (event: MultipartProgressEvent) => void): this;
|
|
337
|
+
getId(): string;
|
|
338
|
+
getPath(): string;
|
|
339
|
+
start(): Promise<MultipartS3Result>;
|
|
340
|
+
private setupEventListeners;
|
|
341
|
+
cancel(): Promise<boolean>;
|
|
342
|
+
pause(): Promise<boolean>;
|
|
343
|
+
resume(): Promise<boolean>;
|
|
344
|
+
private cleanup;
|
|
345
|
+
}
|
|
346
|
+
export declare const startMultipartS3: (options: MultipartS3Options) => Promise<MultipartS3Result>;
|
|
347
|
+
export declare const cancelMultipartS3: (uploadId: string) => Promise<boolean>;
|
|
348
|
+
export declare const pauseMultipartS3: (uploadId: string) => Promise<boolean>;
|
|
349
|
+
export declare const resumeMultipartS3: (uploadId: string) => Promise<boolean>;
|
|
350
|
+
export declare const setMultipartCompletionHandler: (handler: MultipartCompletionHandler | null) => void;
|
|
351
|
+
export declare const getMultipartS3Uploads: () => Promise<MultipartPendingUpload[]>;
|
|
352
|
+
export declare const acknowledgeMultipartS3: (uploadId: string) => Promise<boolean>;
|
|
353
|
+
export declare const addMultipartListener: (eventType: MultipartEventType, uploadId: string, listener: (data: any) => void) => EmitterSubscription;
|
|
195
354
|
export declare const getFileInfo: (path: string) => Promise<FileInfo>;
|
|
196
355
|
export declare const startUpload: (options: UploadOptions) => Promise<string>;
|
|
197
356
|
export declare const cancelUpload: (cancelUploadId: string) => Promise<boolean>;
|
|
@@ -199,6 +358,6 @@ export declare const addListener: (eventType: UploadEvent, uploadId: string, lis
|
|
|
199
358
|
export declare const canSuspendIfBackground: () => void;
|
|
200
359
|
export declare const shouldLimitNetwork: (limit: boolean) => void;
|
|
201
360
|
export declare const getAllUploads: () => Promise<NativeUploadInfo[]>;
|
|
202
|
-
export { Upload };
|
|
361
|
+
export { Upload, MultipartS3Upload };
|
|
203
362
|
export default Upload;
|
|
204
363
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|