@kesha-antonov/react-native-background-downloader 3.1.0 → 3.1.2-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/README.md +10 -6
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/eko/Downloader.java +22 -2
- package/android/src/main/java/com/eko/OnBegin.java +2 -2
- package/android/src/main/java/com/eko/OnProgress.java +4 -4
- package/android/src/main/java/com/eko/ProgressCallback.java +1 -1
- package/android/src/main/java/com/eko/RNBackgroundDownloaderModule.java +25 -21
- package/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.16.3/ext/ffi_c/libffi/.ci/compile +351 -0
- package/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.16.3/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
- package/index.d.ts +1 -0
- package/index.ts +6 -6
- package/ios/RNBackgroundDownloader.h +0 -14
- package/ios/RNBackgroundDownloader.m +0 -8
- package/ios/RNBackgroundDownloader.xcodeproj/project.pbxproj +4 -4
- package/package.json +6 -3
- package/react-native-background-downloader.podspec +1 -1
package/README.md
CHANGED
|
@@ -3,23 +3,21 @@
|
|
|
3
3
|
[](https://badge.fury.io/js/@kesha-antonov%2Freact-native-background-downloader)
|
|
4
4
|
|
|
5
5
|
# @kesha-antonov/react-native-background-downloader
|
|
6
|
-
## *Note - This is fork of https://github.com/EkoLabs/react-native-background-downloader maintained by https://github.com/kesha-antonov * ##
|
|
7
6
|
|
|
8
7
|
A library for React-Native to help you download large files on iOS and Android both in the foreground and most importantly in the background.
|
|
9
8
|
|
|
10
9
|
### Why?
|
|
10
|
+
|
|
11
11
|
On iOS, if you want to download big files no matter the state of your app, wether it's in the background or terminated by the OS, you have to use a system API called `NSURLSession`.
|
|
12
12
|
|
|
13
13
|
This API handles your downloads separately from your app and only keeps it informed using delegates (Read: [Downloading Files in the Background](https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_in_the_background)).
|
|
14
14
|
|
|
15
|
-
On Android we are
|
|
15
|
+
On Android we are using similar process with [DownloadManager](https://developer.android.com/reference/android/app/DownloadManager)
|
|
16
16
|
|
|
17
17
|
The real challenge of using this method is making sure the app's UI is always up-to-date with the downloads that are happening in another process because your app might startup from scratch while the downloads are still running.
|
|
18
18
|
|
|
19
19
|
`@kesha-antonov/react-native-background-downloader` gives you an easy API to both downloading large files and re-attaching to those downloads once your app launches again.
|
|
20
20
|
|
|
21
|
-
> **Please Note** - This library was created to better facilitate background downloading on iOS. If you're not aiming to to use the download-in-background functionality, there are better solutions like [RNFS.downloadFile()](https://github.com/itinance/react-native-fs#downloadfileoptions-downloadfileoptions--jobid-number-promise-promisedownloadresult-) which will results in a more stable download experience for your app.
|
|
22
|
-
|
|
23
21
|
## ToC
|
|
24
22
|
|
|
25
23
|
- [Usage](#usage)
|
|
@@ -332,11 +330,17 @@ Stops the download for good and removes the file that was written so far
|
|
|
332
330
|
|
|
333
331
|
An absolute path to the app's documents directory. It is recommended that you use this path as the target of downloaded files.
|
|
334
332
|
|
|
333
|
+
## TODO
|
|
334
|
+
|
|
335
|
+
- [ ] Write better examples - current kinda old and shallow
|
|
336
|
+
- [ ] Write better API for downloads - current kinda boilerplate
|
|
337
|
+
- [ ] Add more tests
|
|
338
|
+
|
|
335
339
|
## Authors
|
|
336
340
|
|
|
337
|
-
|
|
341
|
+
Re-written & maintained by [Kesha Antonov](https://github.com/kesha-antonov)
|
|
338
342
|
|
|
339
|
-
|
|
343
|
+
Originally developed by [Elad Gil](https://github.com/ptelad) of [Eko](https://github.com/ekolabs/react-native-background-downloader)
|
|
340
344
|
|
|
341
345
|
## License
|
|
342
346
|
Apache 2
|
|
@@ -2,6 +2,7 @@ package com.eko;
|
|
|
2
2
|
|
|
3
3
|
import android.app.DownloadManager;
|
|
4
4
|
import android.content.Context;
|
|
5
|
+
import android.content.Intent;
|
|
5
6
|
import android.database.Cursor;
|
|
6
7
|
import android.net.Uri;
|
|
7
8
|
import android.os.Environment;
|
|
@@ -13,6 +14,9 @@ import com.facebook.react.bridge.WritableMap;
|
|
|
13
14
|
import com.facebook.react.bridge.WritableNativeMap;
|
|
14
15
|
|
|
15
16
|
import java.util.HashMap;
|
|
17
|
+
import java.util.HashSet;
|
|
18
|
+
import java.util.Set;
|
|
19
|
+
|
|
16
20
|
import android.util.Log;
|
|
17
21
|
|
|
18
22
|
import static android.content.Context.DOWNLOAD_SERVICE;
|
|
@@ -22,6 +26,8 @@ public class Downloader {
|
|
|
22
26
|
public DownloadManager downloadManager;
|
|
23
27
|
private Context context;
|
|
24
28
|
|
|
29
|
+
private HashSet<String> alreadySentIntentDownloadIds = new HashSet<>();
|
|
30
|
+
|
|
25
31
|
public Downloader(Context ctx) {
|
|
26
32
|
context = ctx;
|
|
27
33
|
downloadManager = (DownloadManager) ctx.getSystemService(DOWNLOAD_SERVICE);
|
|
@@ -138,6 +144,20 @@ public class Downloader {
|
|
|
138
144
|
reasonText = "UNKNOWN";
|
|
139
145
|
}
|
|
140
146
|
break;
|
|
147
|
+
|
|
148
|
+
case DownloadManager.STATUS_SUCCESSFUL:
|
|
149
|
+
if(!alreadySentIntentDownloadIds.contains(downloadId)) {
|
|
150
|
+
alreadySentIntentDownloadIds.add(downloadId);
|
|
151
|
+
|
|
152
|
+
// broadcast the download complete to handle the case where the app was closed when the download was done
|
|
153
|
+
Intent intent = new Intent(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
|
|
154
|
+
|
|
155
|
+
// You can add extras to the intent if needed
|
|
156
|
+
intent.putExtra(DownloadManager.EXTRA_DOWNLOAD_ID, Long.parseLong(downloadId));
|
|
157
|
+
context.sendBroadcast(intent);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
break;
|
|
141
161
|
}
|
|
142
162
|
|
|
143
163
|
WritableMap result = Arguments.createMap();
|
|
@@ -147,8 +167,8 @@ public class Downloader {
|
|
|
147
167
|
result.putInt("reason", reason);
|
|
148
168
|
result.putString("reasonText", reasonText);
|
|
149
169
|
|
|
150
|
-
result.
|
|
151
|
-
result.
|
|
170
|
+
result.putDouble("bytesDownloaded", Long.parseLong(bytesDownloadedSoFar));
|
|
171
|
+
result.putDouble("bytesTotal", Long.parseLong(totalSizeBytes));
|
|
152
172
|
result.putString("localUri", localUri);
|
|
153
173
|
|
|
154
174
|
return result;
|
|
@@ -37,11 +37,11 @@ public class OnBegin extends Thread {
|
|
|
37
37
|
con.getInputStream().close();
|
|
38
38
|
|
|
39
39
|
WritableMap params = Arguments.createMap();
|
|
40
|
-
|
|
40
|
+
long contentLength = Long.valueOf(headersMap.getString("Content-Length"));
|
|
41
41
|
|
|
42
42
|
params.putString("id", config.id);
|
|
43
43
|
params.putMap("headers", headersMap);
|
|
44
|
-
params.
|
|
44
|
+
params.putDouble("expectedBytes", contentLength);
|
|
45
45
|
|
|
46
46
|
ee.emit("downloadBegin", params);
|
|
47
47
|
} catch (Exception e) {
|
|
@@ -17,8 +17,8 @@ public class OnProgress extends Thread {
|
|
|
17
17
|
private final DownloadManager.Query query;
|
|
18
18
|
private final Downloader downloader;
|
|
19
19
|
private Cursor cursor;
|
|
20
|
-
private
|
|
21
|
-
private
|
|
20
|
+
private long lastBytesDownloaded;
|
|
21
|
+
private long bytesTotal;
|
|
22
22
|
private ProgressCallback callback;
|
|
23
23
|
|
|
24
24
|
private RNBGDTaskConfig config;
|
|
@@ -72,10 +72,10 @@ public class OnProgress extends Thread {
|
|
|
72
72
|
|
|
73
73
|
// get total bytes of the file
|
|
74
74
|
if (bytesTotal <= 0) {
|
|
75
|
-
bytesTotal = cursor.
|
|
75
|
+
bytesTotal = (long)(cursor.getDouble(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)));
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
long bytesDownloaded = (long)(cursor.getDouble(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)));
|
|
79
79
|
|
|
80
80
|
if (bytesTotal > 0 && bytesDownloaded == bytesTotal) {
|
|
81
81
|
this.handleInterrupt();
|
|
@@ -83,11 +83,12 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
|
|
|
83
83
|
|
|
84
84
|
private static Object sharedLock = new Object();
|
|
85
85
|
|
|
86
|
-
private static void
|
|
86
|
+
private static void moveFile(File src, File dst) throws IOException {
|
|
87
87
|
FileChannel inChannel = new FileInputStream(src).getChannel();
|
|
88
88
|
FileChannel outChannel = new FileOutputStream(dst).getChannel();
|
|
89
89
|
try {
|
|
90
90
|
inChannel.transferTo(0, inChannel.size(), outChannel);
|
|
91
|
+
src.delete();
|
|
91
92
|
} finally {
|
|
92
93
|
if (inChannel != null)
|
|
93
94
|
inChannel.close();
|
|
@@ -120,20 +121,23 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
|
|
|
120
121
|
File file = new File(localUri);
|
|
121
122
|
File dest = new File(config.destination);
|
|
122
123
|
|
|
123
|
-
//
|
|
124
|
-
if
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
// only move if source file exists (to handle case if this intent is double called)
|
|
125
|
+
if(file.exists()) {
|
|
126
|
+
// REMOVE DEST FILE IF EXISTS
|
|
127
|
+
if (dest.exists()) {
|
|
128
|
+
dest.delete();
|
|
129
|
+
}
|
|
127
130
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
// CREATE DESTINATION DIR IF NOT EXISTS
|
|
132
|
+
File destDir = new File(dest.getParent());
|
|
133
|
+
if (!destDir.exists()) {
|
|
134
|
+
destDir.mkdirs();
|
|
135
|
+
}
|
|
133
136
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
// MOVE FILE
|
|
138
|
+
moveFile(file, dest);
|
|
139
|
+
file.delete();
|
|
140
|
+
}
|
|
137
141
|
|
|
138
142
|
WritableMap params = Arguments.createMap();
|
|
139
143
|
params.putString("id", config.id);
|
|
@@ -414,14 +418,14 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
|
|
|
414
418
|
downloader,
|
|
415
419
|
new ProgressCallback() {
|
|
416
420
|
@Override
|
|
417
|
-
public void onProgress(String configId,
|
|
418
|
-
double prevPercent = configIdToPercent.
|
|
421
|
+
public void onProgress(String configId, long bytesDownloaded, long bytesTotal) {
|
|
422
|
+
double prevPercent = configIdToPercent.getOrDefault(configId, 0.0);
|
|
419
423
|
double percent = (double) bytesDownloaded / bytesTotal;
|
|
420
424
|
if (percent - prevPercent > 0.01) {
|
|
421
425
|
WritableMap params = Arguments.createMap();
|
|
422
426
|
params.putString("id", configId);
|
|
423
|
-
params.
|
|
424
|
-
params.
|
|
427
|
+
params.putDouble("bytesDownloaded", bytesDownloaded);
|
|
428
|
+
params.putDouble("bytesTotal", bytesTotal);
|
|
425
429
|
|
|
426
430
|
progressReports.put(configId, params);
|
|
427
431
|
configIdToPercent.put(configId, percent);
|
|
@@ -521,11 +525,11 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
|
|
|
521
525
|
params.putString("metadata", config.metadata);
|
|
522
526
|
params.putInt("state", stateMap.get(downloadStatus.getInt("status")));
|
|
523
527
|
|
|
524
|
-
|
|
525
|
-
params.
|
|
528
|
+
double bytesDownloaded = downloadStatus.getDouble("bytesDownloaded");
|
|
529
|
+
params.putDouble("bytesDownloaded", bytesDownloaded);
|
|
526
530
|
|
|
527
|
-
|
|
528
|
-
params.
|
|
531
|
+
double bytesTotal = downloadStatus.getDouble("bytesTotal");
|
|
532
|
+
params.putDouble("bytesTotal", bytesTotal);
|
|
529
533
|
|
|
530
534
|
foundIds.pushMap(params);
|
|
531
535
|
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
#! /bin/sh
|
|
2
|
+
# Wrapper for compilers which do not understand '-c -o'.
|
|
3
|
+
|
|
4
|
+
scriptversion=2018-03-27.18; # UTC
|
|
5
|
+
|
|
6
|
+
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
|
7
|
+
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
8
|
+
#
|
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation; either version 2, or (at your option)
|
|
12
|
+
# any later version.
|
|
13
|
+
#
|
|
14
|
+
# This program is distributed in the hope that it will be useful,
|
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
+
# GNU General Public License for more details.
|
|
18
|
+
#
|
|
19
|
+
# You should have received a copy of the GNU General Public License
|
|
20
|
+
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
21
|
+
|
|
22
|
+
# As a special exception to the GNU General Public License, if you
|
|
23
|
+
# distribute this file as part of a program that contains a
|
|
24
|
+
# configuration script generated by Autoconf, you may include it under
|
|
25
|
+
# the same distribution terms that you use for the rest of that program.
|
|
26
|
+
|
|
27
|
+
# This file is maintained in Automake, please report
|
|
28
|
+
# bugs to <bug-automake@gnu.org> or send patches to
|
|
29
|
+
# <automake-patches@gnu.org>.
|
|
30
|
+
|
|
31
|
+
nl='
|
|
32
|
+
'
|
|
33
|
+
|
|
34
|
+
# We need space, tab and new line, in precisely that order. Quoting is
|
|
35
|
+
# there to prevent tools from complaining about whitespace usage.
|
|
36
|
+
IFS=" "" $nl"
|
|
37
|
+
|
|
38
|
+
file_conv=
|
|
39
|
+
|
|
40
|
+
# func_file_conv build_file lazy
|
|
41
|
+
# Convert a $build file to $host form and store it in $file
|
|
42
|
+
# Currently only supports Windows hosts. If the determined conversion
|
|
43
|
+
# type is listed in (the comma separated) LAZY, no conversion will
|
|
44
|
+
# take place.
|
|
45
|
+
func_file_conv ()
|
|
46
|
+
{
|
|
47
|
+
file=$1
|
|
48
|
+
case $file in
|
|
49
|
+
/ | /[!/]*) # absolute file, and not a UNC file
|
|
50
|
+
if test -z "$file_conv"; then
|
|
51
|
+
# lazily determine how to convert abs files
|
|
52
|
+
case `uname -s` in
|
|
53
|
+
MINGW*)
|
|
54
|
+
file_conv=mingw
|
|
55
|
+
;;
|
|
56
|
+
CYGWIN*)
|
|
57
|
+
file_conv=cygwin
|
|
58
|
+
;;
|
|
59
|
+
*)
|
|
60
|
+
file_conv=wine
|
|
61
|
+
;;
|
|
62
|
+
esac
|
|
63
|
+
fi
|
|
64
|
+
case $file_conv/,$2, in
|
|
65
|
+
*,$file_conv,*)
|
|
66
|
+
;;
|
|
67
|
+
mingw/*)
|
|
68
|
+
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
|
69
|
+
;;
|
|
70
|
+
cygwin/*)
|
|
71
|
+
file=`cygpath -m "$file" || echo "$file"`
|
|
72
|
+
;;
|
|
73
|
+
wine/*)
|
|
74
|
+
file=`winepath -w "$file" || echo "$file"`
|
|
75
|
+
;;
|
|
76
|
+
esac
|
|
77
|
+
;;
|
|
78
|
+
esac
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# func_cl_dashL linkdir
|
|
82
|
+
# Make cl look for libraries in LINKDIR
|
|
83
|
+
func_cl_dashL ()
|
|
84
|
+
{
|
|
85
|
+
func_file_conv "$1"
|
|
86
|
+
if test -z "$lib_path"; then
|
|
87
|
+
lib_path=$file
|
|
88
|
+
else
|
|
89
|
+
lib_path="$lib_path;$file"
|
|
90
|
+
fi
|
|
91
|
+
linker_opts="$linker_opts -LIBPATH:$file"
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# func_cl_dashl library
|
|
95
|
+
# Do a library search-path lookup for cl
|
|
96
|
+
func_cl_dashl ()
|
|
97
|
+
{
|
|
98
|
+
lib=$1
|
|
99
|
+
found=no
|
|
100
|
+
save_IFS=$IFS
|
|
101
|
+
IFS=';'
|
|
102
|
+
for dir in $lib_path $LIB
|
|
103
|
+
do
|
|
104
|
+
IFS=$save_IFS
|
|
105
|
+
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
106
|
+
found=yes
|
|
107
|
+
lib=$dir/$lib.dll.lib
|
|
108
|
+
break
|
|
109
|
+
fi
|
|
110
|
+
if test -f "$dir/$lib.lib"; then
|
|
111
|
+
found=yes
|
|
112
|
+
lib=$dir/$lib.lib
|
|
113
|
+
break
|
|
114
|
+
fi
|
|
115
|
+
if test -f "$dir/lib$lib.a"; then
|
|
116
|
+
found=yes
|
|
117
|
+
lib=$dir/lib$lib.a
|
|
118
|
+
break
|
|
119
|
+
fi
|
|
120
|
+
done
|
|
121
|
+
IFS=$save_IFS
|
|
122
|
+
|
|
123
|
+
if test "$found" != yes; then
|
|
124
|
+
lib=$lib.lib
|
|
125
|
+
fi
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# func_cl_wrapper cl arg...
|
|
129
|
+
# Adjust compile command to suit cl
|
|
130
|
+
func_cl_wrapper ()
|
|
131
|
+
{
|
|
132
|
+
# Assume a capable shell
|
|
133
|
+
lib_path=
|
|
134
|
+
shared=:
|
|
135
|
+
linker_opts=
|
|
136
|
+
for arg
|
|
137
|
+
do
|
|
138
|
+
if test -n "$eat"; then
|
|
139
|
+
eat=
|
|
140
|
+
else
|
|
141
|
+
case $1 in
|
|
142
|
+
-o)
|
|
143
|
+
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
144
|
+
eat=1
|
|
145
|
+
case $2 in
|
|
146
|
+
*.o | *.[oO][bB][jJ])
|
|
147
|
+
func_file_conv "$2"
|
|
148
|
+
set x "$@" -Fo"$file"
|
|
149
|
+
shift
|
|
150
|
+
;;
|
|
151
|
+
*)
|
|
152
|
+
func_file_conv "$2"
|
|
153
|
+
set x "$@" -Fe"$file"
|
|
154
|
+
shift
|
|
155
|
+
;;
|
|
156
|
+
esac
|
|
157
|
+
;;
|
|
158
|
+
-I)
|
|
159
|
+
eat=1
|
|
160
|
+
func_file_conv "$2" mingw
|
|
161
|
+
set x "$@" -I"$file"
|
|
162
|
+
shift
|
|
163
|
+
;;
|
|
164
|
+
-I*)
|
|
165
|
+
func_file_conv "${1#-I}" mingw
|
|
166
|
+
set x "$@" -I"$file"
|
|
167
|
+
shift
|
|
168
|
+
;;
|
|
169
|
+
-l)
|
|
170
|
+
eat=1
|
|
171
|
+
func_cl_dashl "$2"
|
|
172
|
+
set x "$@" "$lib"
|
|
173
|
+
shift
|
|
174
|
+
;;
|
|
175
|
+
-l*)
|
|
176
|
+
func_cl_dashl "${1#-l}"
|
|
177
|
+
set x "$@" "$lib"
|
|
178
|
+
shift
|
|
179
|
+
;;
|
|
180
|
+
-L)
|
|
181
|
+
eat=1
|
|
182
|
+
func_cl_dashL "$2"
|
|
183
|
+
;;
|
|
184
|
+
-L*)
|
|
185
|
+
func_cl_dashL "${1#-L}"
|
|
186
|
+
;;
|
|
187
|
+
-static)
|
|
188
|
+
shared=false
|
|
189
|
+
;;
|
|
190
|
+
-warn)
|
|
191
|
+
eat=1
|
|
192
|
+
;;
|
|
193
|
+
-Wl,*)
|
|
194
|
+
arg=${1#-Wl,}
|
|
195
|
+
save_ifs="$IFS"; IFS=','
|
|
196
|
+
for flag in $arg; do
|
|
197
|
+
IFS="$save_ifs"
|
|
198
|
+
linker_opts="$linker_opts $flag"
|
|
199
|
+
done
|
|
200
|
+
IFS="$save_ifs"
|
|
201
|
+
;;
|
|
202
|
+
-Xlinker)
|
|
203
|
+
eat=1
|
|
204
|
+
linker_opts="$linker_opts $2"
|
|
205
|
+
;;
|
|
206
|
+
-*)
|
|
207
|
+
set x "$@" "$1"
|
|
208
|
+
shift
|
|
209
|
+
;;
|
|
210
|
+
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
211
|
+
func_file_conv "$1"
|
|
212
|
+
set x "$@" -Tp"$file"
|
|
213
|
+
shift
|
|
214
|
+
;;
|
|
215
|
+
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
216
|
+
func_file_conv "$1" mingw
|
|
217
|
+
set x "$@" "$file"
|
|
218
|
+
shift
|
|
219
|
+
;;
|
|
220
|
+
*)
|
|
221
|
+
set x "$@" "$1"
|
|
222
|
+
shift
|
|
223
|
+
;;
|
|
224
|
+
esac
|
|
225
|
+
fi
|
|
226
|
+
shift
|
|
227
|
+
done
|
|
228
|
+
if test -n "$linker_opts"; then
|
|
229
|
+
linker_opts="-link$linker_opts"
|
|
230
|
+
fi
|
|
231
|
+
exec "$@" $linker_opts
|
|
232
|
+
exit 1
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
eat=
|
|
236
|
+
|
|
237
|
+
case $1 in
|
|
238
|
+
'')
|
|
239
|
+
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
240
|
+
exit 1;
|
|
241
|
+
;;
|
|
242
|
+
-h | --h*)
|
|
243
|
+
cat <<\EOF
|
|
244
|
+
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
245
|
+
|
|
246
|
+
Wrapper for compilers which do not understand '-c -o'.
|
|
247
|
+
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
248
|
+
arguments, and rename the output as expected.
|
|
249
|
+
|
|
250
|
+
If you are trying to build a whole package this is not the
|
|
251
|
+
right script to run: please start by reading the file 'INSTALL'.
|
|
252
|
+
|
|
253
|
+
Report bugs to <bug-automake@gnu.org>.
|
|
254
|
+
EOF
|
|
255
|
+
exit $?
|
|
256
|
+
;;
|
|
257
|
+
-v | --v*)
|
|
258
|
+
echo "compile $scriptversion"
|
|
259
|
+
exit $?
|
|
260
|
+
;;
|
|
261
|
+
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
|
262
|
+
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
|
263
|
+
func_cl_wrapper "$@" # Doesn't return...
|
|
264
|
+
;;
|
|
265
|
+
esac
|
|
266
|
+
|
|
267
|
+
ofile=
|
|
268
|
+
cfile=
|
|
269
|
+
|
|
270
|
+
for arg
|
|
271
|
+
do
|
|
272
|
+
if test -n "$eat"; then
|
|
273
|
+
eat=
|
|
274
|
+
else
|
|
275
|
+
case $1 in
|
|
276
|
+
-o)
|
|
277
|
+
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
278
|
+
# So we strip '-o arg' only if arg is an object.
|
|
279
|
+
eat=1
|
|
280
|
+
case $2 in
|
|
281
|
+
*.o | *.obj)
|
|
282
|
+
ofile=$2
|
|
283
|
+
;;
|
|
284
|
+
*)
|
|
285
|
+
set x "$@" -o "$2"
|
|
286
|
+
shift
|
|
287
|
+
;;
|
|
288
|
+
esac
|
|
289
|
+
;;
|
|
290
|
+
*.c)
|
|
291
|
+
cfile=$1
|
|
292
|
+
set x "$@" "$1"
|
|
293
|
+
shift
|
|
294
|
+
;;
|
|
295
|
+
*)
|
|
296
|
+
set x "$@" "$1"
|
|
297
|
+
shift
|
|
298
|
+
;;
|
|
299
|
+
esac
|
|
300
|
+
fi
|
|
301
|
+
shift
|
|
302
|
+
done
|
|
303
|
+
|
|
304
|
+
if test -z "$ofile" || test -z "$cfile"; then
|
|
305
|
+
# If no '-o' option was seen then we might have been invoked from a
|
|
306
|
+
# pattern rule where we don't need one. That is ok -- this is a
|
|
307
|
+
# normal compilation that the losing compiler can handle. If no
|
|
308
|
+
# '.c' file was seen then we are probably linking. That is also
|
|
309
|
+
# ok.
|
|
310
|
+
exec "$@"
|
|
311
|
+
fi
|
|
312
|
+
|
|
313
|
+
# Name of file we expect compiler to create.
|
|
314
|
+
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
315
|
+
|
|
316
|
+
# Create the lock directory.
|
|
317
|
+
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
318
|
+
# that we are using for the .o file. Also, base the name on the expected
|
|
319
|
+
# object file name, since that is what matters with a parallel build.
|
|
320
|
+
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
321
|
+
while true; do
|
|
322
|
+
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
323
|
+
break
|
|
324
|
+
fi
|
|
325
|
+
sleep 1
|
|
326
|
+
done
|
|
327
|
+
# FIXME: race condition here if user kills between mkdir and trap.
|
|
328
|
+
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
329
|
+
|
|
330
|
+
# Run the compile.
|
|
331
|
+
"$@"
|
|
332
|
+
ret=$?
|
|
333
|
+
|
|
334
|
+
if test -f "$cofile"; then
|
|
335
|
+
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
336
|
+
elif test -f "${cofile}bj"; then
|
|
337
|
+
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
338
|
+
fi
|
|
339
|
+
|
|
340
|
+
rmdir "$lockdir"
|
|
341
|
+
exit $ret
|
|
342
|
+
|
|
343
|
+
# Local Variables:
|
|
344
|
+
# mode: shell-script
|
|
345
|
+
# sh-indentation: 2
|
|
346
|
+
# eval: (add-hook 'before-save-hook 'time-stamp)
|
|
347
|
+
# time-stamp-start: "scriptversion="
|
|
348
|
+
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
349
|
+
# time-stamp-time-zone: "UTC0"
|
|
350
|
+
# time-stamp-end: "; # UTC"
|
|
351
|
+
# End:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
CC = gcc
|
|
2
|
+
CFLAGS = -O2 -Wall
|
|
3
|
+
prefix =
|
|
4
|
+
includedir = $(prefix)/include
|
|
5
|
+
libdir = $(prefix)/lib
|
|
6
|
+
CPPFLAGS = -I$(includedir)
|
|
7
|
+
LDFLAGS = -L$(libdir) -Wl,-rpath,$(libdir)
|
|
8
|
+
|
|
9
|
+
all: check-call check-callback
|
|
10
|
+
|
|
11
|
+
test-call: test-call.c testcases.c
|
|
12
|
+
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-call test-call.c -lffi
|
|
13
|
+
|
|
14
|
+
test-callback: test-callback.c testcases.c
|
|
15
|
+
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-callback test-callback.c -lffi
|
|
16
|
+
|
|
17
|
+
check-call: test-call
|
|
18
|
+
./test-call > test-call.out
|
|
19
|
+
LC_ALL=C uniq -u < test-call.out > failed-call
|
|
20
|
+
test '!' -s failed-call
|
|
21
|
+
|
|
22
|
+
check-callback: test-callback
|
|
23
|
+
./test-callback > test-callback.out
|
|
24
|
+
LC_ALL=C uniq -u < test-callback.out > failed-callback
|
|
25
|
+
test '!' -s failed-callback
|
|
26
|
+
|
|
27
|
+
clean:
|
|
28
|
+
rm -f test-call test-callback test-call.out test-callback.out failed-call failed-callback
|
package/index.d.ts
CHANGED
package/index.ts
CHANGED
|
@@ -13,7 +13,7 @@ const config = {
|
|
|
13
13
|
isLogsEnabled: false,
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
function log(...args) {
|
|
16
|
+
function log (...args) {
|
|
17
17
|
if (config.isLogsEnabled)
|
|
18
18
|
console.log('[RNBackgroundDownloader]', ...args)
|
|
19
19
|
}
|
|
@@ -50,7 +50,7 @@ RNBackgroundDownloaderEmitter.addListener('downloadFailed', ({ id, ...rest }) =>
|
|
|
50
50
|
tasksMap.delete(id)
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
export function setConfig({ headers, progressInterval, isLogsEnabled }) {
|
|
53
|
+
export function setConfig ({ headers, progressInterval, isLogsEnabled }) {
|
|
54
54
|
if (typeof headers === 'object') config.headers = headers
|
|
55
55
|
|
|
56
56
|
if (progressInterval != null)
|
|
@@ -62,7 +62,7 @@ export function setConfig({ headers, progressInterval, isLogsEnabled }) {
|
|
|
62
62
|
if (typeof isLogsEnabled === 'boolean') config.isLogsEnabled = isLogsEnabled
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
export function checkForExistingDownloads() {
|
|
65
|
+
export function checkForExistingDownloads () {
|
|
66
66
|
log('[RNBackgroundDownloader] checkForExistingDownloads-1')
|
|
67
67
|
return RNBackgroundDownloader.checkForExistingDownloads()
|
|
68
68
|
.then(foundTasks => {
|
|
@@ -92,7 +92,7 @@ export function checkForExistingDownloads() {
|
|
|
92
92
|
})
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
export function ensureDownloadsAreRunning() {
|
|
95
|
+
export function ensureDownloadsAreRunning () {
|
|
96
96
|
log('[RNBackgroundDownloader] ensureDownloadsAreRunning')
|
|
97
97
|
return checkForExistingDownloads()
|
|
98
98
|
.then(tasks => {
|
|
@@ -104,7 +104,7 @@ export function ensureDownloadsAreRunning() {
|
|
|
104
104
|
})
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
export function completeHandler(jobId: string) {
|
|
107
|
+
export function completeHandler (jobId: string) {
|
|
108
108
|
if (jobId == null) {
|
|
109
109
|
console.warn('[RNBackgroundDownloader] completeHandler: jobId is empty')
|
|
110
110
|
return
|
|
@@ -124,7 +124,7 @@ type DownloadOptions = {
|
|
|
124
124
|
isNotificationVisible?: boolean;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
export function download(options: DownloadOptions) {
|
|
127
|
+
export function download (options: DownloadOptions) {
|
|
128
128
|
log('[RNBackgroundDownloader] download', options)
|
|
129
129
|
if (!options.id || !options.url || !options.destination)
|
|
130
130
|
throw new Error('[RNBackgroundDownloader] id, url and destination are required')
|
|
@@ -1,19 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
// RNFileBackgroundDownload.h
|
|
3
|
-
// EkoApp
|
|
4
|
-
//
|
|
5
|
-
// Created by Elad Gil on 20/11/2017.
|
|
6
|
-
// Copyright © 2017 Eko. All rights reserved.
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
#import <Foundation/Foundation.h>
|
|
10
|
-
#if __has_include(<React/RCTBridgeModule.h>)
|
|
11
1
|
#import <React/RCTBridgeModule.h>
|
|
12
2
|
#import <React/RCTEventEmitter.h>
|
|
13
|
-
#elif __has_include("RCTBridgeModule.h")
|
|
14
|
-
#import "RCTBridgeModule.h"
|
|
15
|
-
#import "RCTEventEmitter.h"
|
|
16
|
-
#endif
|
|
17
3
|
|
|
18
4
|
typedef void (^CompletionHandler)();
|
|
19
5
|
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
isa = XCBuildConfiguration;
|
|
126
126
|
buildSettings = {
|
|
127
127
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
128
|
-
CLANG_CXX_LANGUAGE_STANDARD = "
|
|
128
|
+
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
|
129
129
|
CLANG_CXX_LIBRARY = "libc++";
|
|
130
130
|
CLANG_ENABLE_MODULES = YES;
|
|
131
131
|
CLANG_ENABLE_OBJC_ARC = YES;
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
155
155
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
156
156
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
157
|
-
IPHONEOS_DEPLOYMENT_TARGET =
|
|
157
|
+
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
|
158
158
|
MTL_ENABLE_DEBUG_INFO = YES;
|
|
159
159
|
ONLY_ACTIVE_ARCH = YES;
|
|
160
160
|
SDKROOT = iphoneos;
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
isa = XCBuildConfiguration;
|
|
166
166
|
buildSettings = {
|
|
167
167
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
168
|
-
CLANG_CXX_LANGUAGE_STANDARD = "
|
|
168
|
+
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
|
169
169
|
CLANG_CXX_LIBRARY = "libc++";
|
|
170
170
|
CLANG_ENABLE_MODULES = YES;
|
|
171
171
|
CLANG_ENABLE_OBJC_ARC = YES;
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
189
189
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
190
190
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
191
|
-
IPHONEOS_DEPLOYMENT_TARGET =
|
|
191
|
+
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
|
192
192
|
MTL_ENABLE_DEBUG_INFO = NO;
|
|
193
193
|
SDKROOT = iphoneos;
|
|
194
194
|
VALIDATE_PRODUCT = YES;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kesha-antonov/react-native-background-downloader",
|
|
3
|
-
"version": "3.1.0",
|
|
3
|
+
"version": "3.1.2-alpha.0",
|
|
4
4
|
"description": "A library for React-Native to help you download large files on iOS and Android both in the foreground and most importantly in the background.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"homepage": "https://github.com/kesha-antonov/react-native-background-downloader",
|
|
16
16
|
"license": "Apache-2.0",
|
|
17
17
|
"author": {
|
|
18
|
-
"name": "
|
|
18
|
+
"name": "Kesha Antonov, Eko labs",
|
|
19
19
|
"email": "innokenty.longway@gmail.com"
|
|
20
20
|
},
|
|
21
21
|
"contributors": [
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"bump": "npm version patch",
|
|
42
42
|
"lint": "eslint .",
|
|
43
|
-
"
|
|
43
|
+
"prepublishOnly": "jest && npm run lint",
|
|
44
44
|
"publish": "npm publish",
|
|
45
45
|
"test": "jest"
|
|
46
46
|
},
|
|
@@ -52,6 +52,9 @@
|
|
|
52
52
|
"setupFiles": [
|
|
53
53
|
"./__mocks__/RNBackgroundDownloader.js",
|
|
54
54
|
"./node_modules/react-native/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js"
|
|
55
|
+
],
|
|
56
|
+
"roots": [
|
|
57
|
+
"./__tests__"
|
|
55
58
|
]
|
|
56
59
|
},
|
|
57
60
|
"devDependencies": {
|
|
@@ -8,7 +8,7 @@ Pod::Spec.new do |s|
|
|
|
8
8
|
s.author = package['author']
|
|
9
9
|
s.homepage = package['repository']['url']
|
|
10
10
|
s.license = package['license']
|
|
11
|
-
s.platform = :ios, '
|
|
11
|
+
s.platform = :ios, '13.4'
|
|
12
12
|
s.source = { git: 'https://github.com/kesha-antonov/react-native-background-downloader.git', tag: 'master' }
|
|
13
13
|
s.source_files = 'ios/**/*.{h,m}'
|
|
14
14
|
s.requires_arc = true
|