diff --git a/android/src/main/java/com/eko/RNBGDTaskConfig.java b/android/src/main/java/com/eko/RNBGDTaskConfig.java index 99a6d9c..5f05a3e 100644 --- a/android/src/main/java/com/eko/RNBGDTaskConfig.java +++ b/android/src/main/java/com/eko/RNBGDTaskConfig.java @@ -4,10 +4,12 @@ import java.io.Serializable; public class RNBGDTaskConfig implements Serializable { public String id; + public String metadata; public boolean reportedBegin; - public RNBGDTaskConfig(String id) { + public RNBGDTaskConfig(String id, String metadata) { this.id = id; + this.metadata = metadata; this.reportedBegin = false; } -} \ No newline at end of file +} diff --git a/android/src/main/java/com/eko/RNBackgroundDownloaderModule.java b/android/src/main/java/com/eko/RNBackgroundDownloaderModule.java index 8888b53..499e3ea 100644 --- a/android/src/main/java/com/eko/RNBackgroundDownloaderModule.java +++ b/android/src/main/java/com/eko/RNBackgroundDownloaderModule.java @@ -204,13 +204,14 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule imp String url = options.getString("url"); String destination = options.getString("destination"); ReadableMap headers = options.getMap("headers"); + String metadata = options.getString("metadata"); if (id == null || url == null || destination == null) { Log.e(getName(), "id, url and destination must be set"); return; } - RNBGDTaskConfig config = new RNBGDTaskConfig(id); + RNBGDTaskConfig config = new RNBGDTaskConfig(id, metadata); final Request request = new Request(url, destination); if (headers != null) { ReadableMapKeySetIterator it = headers.keySetIterator(); @@ -298,6 +299,7 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule imp RNBGDTaskConfig config = requestIdToConfig.get(download.getId()); WritableMap params = Arguments.createMap(); params.putString("id", config.id); + params.putString("metadata", config.metadata); params.putInt("state", stateMap.get(download.getStatus())); params.putInt("bytesWritten", (int)download.getDownloaded()); params.putInt("totalBytes", (int)download.getTotal()); diff --git a/index.js b/index.js index a5bf0db..0713215 100644 --- a/index.js +++ b/index.js @@ -84,6 +84,12 @@ export function download (options) { else options.headers = headers + if (options.metadata && typeof options.metadata === 'object') + options.metadata = JSON.stringify(options.metadata) + else + options.metadata = JSON.stringify({}) + + RNBackgroundDownloader.download(options) const task = new DownloadTask(options.id) tasksMap.set(options.id, task) diff --git a/ios/RNBGDTaskConfig.h b/ios/RNBGDTaskConfig.h index 8e51869..09f488c 100644 --- a/ios/RNBGDTaskConfig.h +++ b/ios/RNBGDTaskConfig.h @@ -12,6 +12,7 @@ @property NSString * _Nonnull id; @property NSString * _Nonnull destination; +@property NSString * _Nonnull metadata; @property BOOL reportedBegin; - (id _Nullable )initWithDictionary: (NSDictionary *_Nonnull)dict; @@ -25,15 +26,17 @@ if (self) { self.id = dict[@"id"]; self.destination = dict[@"destination"]; + self.metadata = dict[@"metadata"]; self.reportedBegin = NO; } - + return self; } - (void)encodeWithCoder:(nonnull NSCoder *)aCoder { [aCoder encodeObject:self.id forKey:@"id"]; [aCoder encodeObject:self.destination forKey:@"destination"]; + [aCoder encodeObject:self.metadata forKey:@"metadata"]; [aCoder encodeBool:self.reportedBegin forKey:@"reportedBegin"]; } @@ -42,9 +45,10 @@ if (self) { self.id = [aDecoder decodeObjectForKey:@"id"]; self.destination = [aDecoder decodeObjectForKey:@"destination"]; + self.metadata = [aDecoder decodeObjectForKey:@"metadata"]; self.reportedBegin = [aDecoder decodeBoolForKey:@"reportedBegin"]; } - + return self; } diff --git a/ios/RNBackgroundDownloader.m b/ios/RNBackgroundDownloader.m index 062de00..8d0ea01 100644 --- a/ios/RNBackgroundDownloader.m +++ b/ios/RNBackgroundDownloader.m @@ -200,6 +200,7 @@ RCT_EXPORT_METHOD(download: (NSDictionary *) options) { NSString *identifier = options[@"id"]; NSString *url = options[@"url"]; NSString *destination = options[@"destination"]; + NSString *metadata = options[@"metadata"]; NSDictionary *headers = options[@"headers"]; if (identifier == nil || url == nil || destination == nil) { NSLog(@"[RNBackgroundDownloader] - [Error] id, url and destination must be set"); @@ -221,7 +222,7 @@ RCT_EXPORT_METHOD(download: (NSDictionary *) options) { return; } - RNBGDTaskConfig *taskConfig = [[RNBGDTaskConfig alloc] initWithDictionary: @{@"id": identifier, @"destination": destination}]; + RNBGDTaskConfig *taskConfig = [[RNBGDTaskConfig alloc] initWithDictionary: @{@"id": identifier, @"destination": destination, @"metadata": metadata}}]; taskToConfigMap[@(task.taskIdentifier)] = taskConfig; [[NSUserDefaults standardUserDefaults] setObject:[self serialize: taskToConfigMap] forKey:ID_TO_CONFIG_MAP_KEY]; @@ -286,6 +287,7 @@ RCT_EXPORT_METHOD(checkForExistingDownloads: (RCTPromiseResolveBlock)resolve rej NSNumber *percent = foundTask.countOfBytesExpectedToReceive > 0 ? [NSNumber numberWithFloat:(float)task.countOfBytesReceived/(float)foundTask.countOfBytesExpectedToReceive] : @0.0; [idsFound addObject:@{ @"id": taskConfig.id, + @"metadata": taskConfig.metadata, @"state": [NSNumber numberWithInt: task.state], @"bytesWritten": [NSNumber numberWithLongLong:task.countOfBytesReceived], @"totalBytes": [NSNumber numberWithLongLong:foundTask.countOfBytesExpectedToReceive], diff --git a/lib/downloadTask.js b/lib/downloadTask.js index c50dc5d..80c341f 100644 --- a/lib/downloadTask.js +++ b/lib/downloadTask.js @@ -10,6 +10,7 @@ export default class DownloadTask { percent = 0 bytesWritten = 0 totalBytes = 0 + metadata = {} constructor (taskInfo, originalTask) { if (typeof taskInfo === 'string') { @@ -19,6 +20,10 @@ export default class DownloadTask { this.percent = taskInfo.percent this.bytesWritten = taskInfo.bytesWritten this.totalBytes = taskInfo.totalBytes + + if (this.#parseable(taskInfo.metadata)) { + this.metadata = JSON.parse(taskInfo.metadata); + } } if (originalTask) { @@ -93,4 +98,13 @@ export default class DownloadTask { this.state = 'STOPPED' RNBackgroundDownloader.stopTask(this.id) } + + #parseable = (element) => { + try { + JSON.parse(element); + return true; + } catch (err) { + return false; + } + } }