react-native-fs-turbo 0.3.0 → 0.3.2
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/RNFSTurbo.podspec +2 -2
- package/android/src/main/cpp/RNFSTurboPlatformHelper.cpp +85 -67
- package/android/src/main/java/com/cmpayc/rnfsturbo/RNFSTurboPlatformHelper.java +16 -7
- package/cpp/NativeRNFSTurboModule.cpp +2 -1
- package/cpp/RNFSTurboHostObject.cpp +64 -46
- package/cpp/RNFSTurboHostObject.h +1 -0
- package/cpp/RNFSTurboPlatformHelper.h +0 -2
- package/package.json +1 -1
package/RNFSTurbo.podspec
CHANGED
|
@@ -11,14 +11,14 @@ Pod::Spec.new do |s|
|
|
|
11
11
|
s.license = package["license"]
|
|
12
12
|
s.platforms = { :ios => "12.4" }
|
|
13
13
|
s.author = package["author"]
|
|
14
|
-
s.source = { :git =>
|
|
14
|
+
s.source = { :git => "https://github.com/cmpayc/react-native-fs-turbo.git", :tag => "#{s.version}" }
|
|
15
15
|
s.source_files = [
|
|
16
16
|
"ios/**/*.{h,m,mm}",
|
|
17
17
|
"cpp/**/*.{hpp,cpp,c,h}",
|
|
18
18
|
]
|
|
19
19
|
s.resource_bundles = { 'RNFS_PrivacyInfo' => 'ios/PrivacyInfo.xcprivacy' }
|
|
20
20
|
s.compiler_flags = '-x objective-c++'
|
|
21
|
-
s.frameworks = 'Photos'
|
|
21
|
+
s.frameworks = 'Photos', 'AVFoundation'
|
|
22
22
|
s.pod_target_xcconfig = {
|
|
23
23
|
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
|
|
24
24
|
}
|
|
@@ -13,58 +13,92 @@ void JavaHashMapToStlStringStringMap(JNIEnv *env, jobject hashMap, std::map<std:
|
|
|
13
13
|
// Get the Map's entry Set.
|
|
14
14
|
jclass mapClass = env->FindClass("java/util/Map");
|
|
15
15
|
if (mapClass == nullptr) {
|
|
16
|
-
|
|
16
|
+
env->DeleteLocalRef(hashMap);
|
|
17
|
+
return;
|
|
17
18
|
}
|
|
18
19
|
jmethodID entrySet =
|
|
19
|
-
|
|
20
|
+
env->GetMethodID(mapClass, "entrySet", "()Ljava/util/Set;");
|
|
20
21
|
if (entrySet == nullptr) {
|
|
22
|
+
env->DeleteLocalRef(hashMap);
|
|
23
|
+
env->DeleteLocalRef(mapClass);
|
|
21
24
|
return;
|
|
22
25
|
}
|
|
23
26
|
jobject set = env->CallObjectMethod(hashMap, entrySet);
|
|
24
27
|
if (set == nullptr) {
|
|
28
|
+
env->DeleteLocalRef(hashMap);
|
|
29
|
+
env->DeleteLocalRef(mapClass);
|
|
25
30
|
return;
|
|
26
31
|
}
|
|
27
32
|
// Obtain an iterator over the Set
|
|
28
33
|
jclass setClass = env->FindClass("java/util/Set");
|
|
29
34
|
if (setClass == nullptr) {
|
|
35
|
+
env->DeleteLocalRef(hashMap);
|
|
36
|
+
env->DeleteLocalRef(mapClass);
|
|
37
|
+
env->DeleteLocalRef(set);
|
|
30
38
|
return;
|
|
31
39
|
}
|
|
32
40
|
jmethodID iterator =
|
|
33
|
-
|
|
41
|
+
env->GetMethodID(setClass, "iterator", "()Ljava/util/Iterator;");
|
|
34
42
|
if (iterator == nullptr) {
|
|
43
|
+
env->DeleteLocalRef(hashMap);
|
|
44
|
+
env->DeleteLocalRef(mapClass);
|
|
45
|
+
env->DeleteLocalRef(set);
|
|
46
|
+
env->DeleteLocalRef(setClass);
|
|
35
47
|
return;
|
|
36
48
|
}
|
|
37
49
|
jobject iter = env->CallObjectMethod(set, iterator);
|
|
38
50
|
if (iter == nullptr) {
|
|
51
|
+
env->DeleteLocalRef(hashMap);
|
|
52
|
+
env->DeleteLocalRef(mapClass);
|
|
53
|
+
env->DeleteLocalRef(set);
|
|
54
|
+
env->DeleteLocalRef(setClass);
|
|
39
55
|
return;
|
|
40
56
|
}
|
|
41
57
|
// Get the Iterator method IDs
|
|
42
58
|
jclass iteratorClass = env->FindClass("java/util/Iterator");
|
|
43
59
|
if (iteratorClass == nullptr) {
|
|
60
|
+
env->DeleteLocalRef(hashMap);
|
|
61
|
+
env->DeleteLocalRef(mapClass);
|
|
62
|
+
env->DeleteLocalRef(set);
|
|
63
|
+
env->DeleteLocalRef(setClass);
|
|
64
|
+
env->DeleteLocalRef(iter);
|
|
44
65
|
return;
|
|
45
66
|
}
|
|
46
67
|
jmethodID hasNext = env->GetMethodID(iteratorClass, "hasNext", "()Z");
|
|
47
|
-
if (hasNext == nullptr) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
68
|
jmethodID next =
|
|
51
|
-
|
|
52
|
-
if (next == nullptr) {
|
|
69
|
+
env->GetMethodID(iteratorClass, "next", "()Ljava/lang/Object;");
|
|
70
|
+
if (hasNext == nullptr || next == nullptr) {
|
|
71
|
+
env->DeleteLocalRef(hashMap);
|
|
72
|
+
env->DeleteLocalRef(mapClass);
|
|
73
|
+
env->DeleteLocalRef(set);
|
|
74
|
+
env->DeleteLocalRef(setClass);
|
|
75
|
+
env->DeleteLocalRef(iter);
|
|
76
|
+
env->DeleteLocalRef(iteratorClass);
|
|
53
77
|
return;
|
|
54
78
|
}
|
|
55
79
|
// Get the Entry class method IDs
|
|
56
80
|
jclass entryClass = env->FindClass("java/util/Map$Entry");
|
|
57
81
|
if (entryClass == nullptr) {
|
|
82
|
+
env->DeleteLocalRef(hashMap);
|
|
83
|
+
env->DeleteLocalRef(mapClass);
|
|
84
|
+
env->DeleteLocalRef(set);
|
|
85
|
+
env->DeleteLocalRef(setClass);
|
|
86
|
+
env->DeleteLocalRef(iter);
|
|
87
|
+
env->DeleteLocalRef(iteratorClass);
|
|
58
88
|
return;
|
|
59
89
|
}
|
|
60
90
|
jmethodID getKey =
|
|
61
|
-
|
|
62
|
-
if (getKey == nullptr) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
91
|
+
env->GetMethodID(entryClass, "getKey", "()Ljava/lang/Object;");
|
|
65
92
|
jmethodID getValue =
|
|
66
|
-
|
|
67
|
-
if (getValue == nullptr) {
|
|
93
|
+
env->GetMethodID(entryClass, "getValue", "()Ljava/lang/Object;");
|
|
94
|
+
if (getKey == nullptr || getValue == nullptr) {
|
|
95
|
+
env->DeleteLocalRef(hashMap);
|
|
96
|
+
env->DeleteLocalRef(mapClass);
|
|
97
|
+
env->DeleteLocalRef(set);
|
|
98
|
+
env->DeleteLocalRef(setClass);
|
|
99
|
+
env->DeleteLocalRef(iter);
|
|
100
|
+
env->DeleteLocalRef(iteratorClass);
|
|
101
|
+
env->DeleteLocalRef(entryClass);
|
|
68
102
|
return;
|
|
69
103
|
}
|
|
70
104
|
// Iterate over the entry Set
|
|
@@ -90,6 +124,13 @@ void JavaHashMapToStlStringStringMap(JNIEnv *env, jobject hashMap, std::map<std:
|
|
|
90
124
|
env->ReleaseStringUTFChars(value, valueStr);
|
|
91
125
|
env->DeleteLocalRef(value);
|
|
92
126
|
}
|
|
127
|
+
env->DeleteLocalRef(hashMap);
|
|
128
|
+
env->DeleteLocalRef(mapClass);
|
|
129
|
+
env->DeleteLocalRef(set);
|
|
130
|
+
env->DeleteLocalRef(setClass);
|
|
131
|
+
env->DeleteLocalRef(iter);
|
|
132
|
+
env->DeleteLocalRef(iteratorClass);
|
|
133
|
+
env->DeleteLocalRef(entryClass);
|
|
93
134
|
}
|
|
94
135
|
|
|
95
136
|
extern "C"
|
|
@@ -102,14 +143,6 @@ JNIEXPORT void JNICALL Java_com_cmpayc_rnfsturbo_RNFSTurboPlatformHelper_downloa
|
|
|
102
143
|
) {
|
|
103
144
|
std::map<int, DownloadCallbacks>::iterator it = RNFSTurboPlatformHelper::downloadCallbacks.find(jobId);
|
|
104
145
|
if (it != RNFSTurboPlatformHelper::downloadCallbacks.end()) {
|
|
105
|
-
const auto now = std::chrono::steady_clock::now();
|
|
106
|
-
const auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
107
|
-
now - RNFSTurboPlatformHelper::downloadCallbacks[jobId].lastProgressCall
|
|
108
|
-
).count();
|
|
109
|
-
RNFSTurboPlatformHelper::downloadCallbacks[jobId].lastProgressCall = now - std::chrono::seconds(1);
|
|
110
|
-
if (elapsedTime < 50) {
|
|
111
|
-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
112
|
-
}
|
|
113
146
|
RNFSTurboPlatformHelper::downloadCallbacks[jobId].completeCallback(
|
|
114
147
|
jobId,
|
|
115
148
|
statusCode,
|
|
@@ -168,20 +201,13 @@ JNIEXPORT void JNICALL Java_com_cmpayc_rnfsturbo_RNFSTurboPlatformHelper_downloa
|
|
|
168
201
|
double contentLength,
|
|
169
202
|
double bytesWritten
|
|
170
203
|
) {
|
|
171
|
-
std::map<int, DownloadCallbacks>::iterator
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
RNFSTurboPlatformHelper::downloadCallbacks[jobId].progressCallback(
|
|
179
|
-
jobId,
|
|
180
|
-
static_cast<float>(contentLength),
|
|
181
|
-
static_cast<float>(bytesWritten)
|
|
182
|
-
);
|
|
183
|
-
RNFSTurboPlatformHelper::downloadCallbacks[jobId].lastProgressCall = now;
|
|
184
|
-
}
|
|
204
|
+
std::map<int, DownloadCallbacks>::iterator it = RNFSTurboPlatformHelper::downloadCallbacks.find(jobId);
|
|
205
|
+
if (it != RNFSTurboPlatformHelper::downloadCallbacks.end()) {
|
|
206
|
+
RNFSTurboPlatformHelper::downloadCallbacks[jobId].progressCallback(
|
|
207
|
+
jobId,
|
|
208
|
+
static_cast<float>(contentLength),
|
|
209
|
+
static_cast<float>(bytesWritten)
|
|
210
|
+
);
|
|
185
211
|
}
|
|
186
212
|
}
|
|
187
213
|
|
|
@@ -196,12 +222,6 @@ JNIEXPORT void JNICALL Java_com_cmpayc_rnfsturbo_RNFSTurboPlatformHelper_uploadC
|
|
|
196
222
|
) {
|
|
197
223
|
std::map<int, UploadCallbacks>::iterator it = RNFSTurboPlatformHelper::uploadCallbacks.find(jobId);
|
|
198
224
|
if (it != RNFSTurboPlatformHelper::uploadCallbacks.end()) {
|
|
199
|
-
const auto now = std::chrono::steady_clock::now();
|
|
200
|
-
const auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(now - RNFSTurboPlatformHelper::uploadCallbacks[jobId].lastProgressCall).count();
|
|
201
|
-
RNFSTurboPlatformHelper::uploadCallbacks[jobId].lastProgressCall = now - std::chrono::seconds(1);
|
|
202
|
-
if (elapsedTime < 50) {
|
|
203
|
-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
204
|
-
}
|
|
205
225
|
std::map<std::string, std::string> headers;
|
|
206
226
|
JavaHashMapToStlStringStringMap(env, headersObj, headers);
|
|
207
227
|
const char *body = env->GetStringUTFChars(bodyStr, nullptr);
|
|
@@ -233,20 +253,13 @@ JNIEXPORT void JNICALL Java_com_cmpayc_rnfsturbo_RNFSTurboPlatformHelper_uploadP
|
|
|
233
253
|
double totalBytesExpectedToSend,
|
|
234
254
|
double totalBytesSent
|
|
235
255
|
) {
|
|
236
|
-
std::map<int, UploadCallbacks>::iterator
|
|
237
|
-
if (
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
RNFSTurboPlatformHelper::uploadCallbacks[jobId].progressCallback(
|
|
244
|
-
jobId,
|
|
245
|
-
static_cast<float>(totalBytesExpectedToSend),
|
|
246
|
-
static_cast<float>(totalBytesSent)
|
|
247
|
-
);
|
|
248
|
-
RNFSTurboPlatformHelper::uploadCallbacks[jobId].lastProgressCall = now;
|
|
249
|
-
}
|
|
256
|
+
std::map<int, UploadCallbacks>::iterator it = RNFSTurboPlatformHelper::uploadCallbacks.find(jobId);
|
|
257
|
+
if (it != RNFSTurboPlatformHelper::uploadCallbacks.end()) {
|
|
258
|
+
RNFSTurboPlatformHelper::uploadCallbacks[jobId].progressCallback(
|
|
259
|
+
jobId,
|
|
260
|
+
static_cast<float>(totalBytesExpectedToSend),
|
|
261
|
+
static_cast<float>(totalBytesSent)
|
|
262
|
+
);
|
|
250
263
|
}
|
|
251
264
|
}
|
|
252
265
|
|
|
@@ -312,7 +325,7 @@ std::vector<ReadDirItem> RNFSTurboPlatformHelper::readDirAssets(const char* dirP
|
|
|
312
325
|
jniObj,
|
|
313
326
|
mid,
|
|
314
327
|
jniEnv->NewStringUTF(dirPath)
|
|
315
|
-
|
|
328
|
+
);
|
|
316
329
|
if (jniEnv->ExceptionCheck()) {
|
|
317
330
|
jniEnv->ExceptionClear();
|
|
318
331
|
throw "Dir not exists or access denied";
|
|
@@ -341,8 +354,8 @@ std::vector<ReadDirItem> RNFSTurboPlatformHelper::readDirAssets(const char* dirP
|
|
|
341
354
|
jniEnv->ReleaseStringUTFChars(isDirectoryStr, isDirectoryChr);
|
|
342
355
|
jniEnv->DeleteLocalRef(isDirectoryStr);
|
|
343
356
|
}
|
|
344
|
-
jniEnv->DeleteLocalRef(filesObject);
|
|
345
357
|
jniEnv->DeleteLocalRef(jniCls);
|
|
358
|
+
jniEnv->DeleteLocalRef(filesObject);
|
|
346
359
|
|
|
347
360
|
return files;
|
|
348
361
|
}
|
|
@@ -369,6 +382,9 @@ std::string RNFSTurboPlatformHelper::readFileAssetsOrRes(const char* filePath, b
|
|
|
369
382
|
std::string fileData = (char*) fileJBytes;
|
|
370
383
|
jniEnv->ReleaseByteArrayElements(fileBytesArr, fileJBytes, 0);
|
|
371
384
|
|
|
385
|
+
jniEnv->DeleteLocalRef(jniCls);
|
|
386
|
+
jniEnv->DeleteLocalRef(fileBytesArr);
|
|
387
|
+
|
|
372
388
|
return fileData;
|
|
373
389
|
}
|
|
374
390
|
|
|
@@ -387,6 +403,7 @@ void RNFSTurboPlatformHelper::copyFileAssetsOrRes(const char *filePath, const ch
|
|
|
387
403
|
jniEnv->NewStringUTF(destPath),
|
|
388
404
|
isRes
|
|
389
405
|
);
|
|
406
|
+
jniEnv->DeleteLocalRef(jniCls);
|
|
390
407
|
if (jniEnv->ExceptionCheck()) {
|
|
391
408
|
jniEnv->ExceptionClear();
|
|
392
409
|
throw isRes ? "Failed to copy res" : "Failed to copy asset";
|
|
@@ -407,6 +424,7 @@ bool RNFSTurboPlatformHelper::existsAssetsOrRes(const char *filePath, bool isRes
|
|
|
407
424
|
jniEnv->NewStringUTF(filePath),
|
|
408
425
|
isRes
|
|
409
426
|
);
|
|
427
|
+
jniEnv->DeleteLocalRef(jniCls);
|
|
410
428
|
if (jniEnv->ExceptionCheck()) {
|
|
411
429
|
jniEnv->ExceptionClear();
|
|
412
430
|
throw isRes ? "Failed to open asset" : "Failed to open res";
|
|
@@ -469,7 +487,7 @@ void RNFSTurboPlatformHelper::downloadFile(
|
|
|
469
487
|
}
|
|
470
488
|
|
|
471
489
|
jniEnv->CallVoidMethod(
|
|
472
|
-
|
|
490
|
+
jniObj,
|
|
473
491
|
mid,
|
|
474
492
|
jobId,
|
|
475
493
|
jniEnv->NewStringUTF(fromUrl),
|
|
@@ -482,9 +500,9 @@ void RNFSTurboPlatformHelper::downloadFile(
|
|
|
482
500
|
hasBeginCallback,
|
|
483
501
|
hasProgressCallback
|
|
484
502
|
);
|
|
503
|
+
jniEnv->DeleteLocalRef(jniCls);
|
|
485
504
|
jniEnv->DeleteLocalRef(mapClass);
|
|
486
505
|
jniEnv->DeleteLocalRef(headersMap);
|
|
487
|
-
jniEnv->DeleteLocalRef(headersMap);
|
|
488
506
|
}
|
|
489
507
|
|
|
490
508
|
void RNFSTurboPlatformHelper::stopDownload(int jobId) {
|
|
@@ -496,7 +514,7 @@ void RNFSTurboPlatformHelper::stopDownload(int jobId) {
|
|
|
496
514
|
);
|
|
497
515
|
|
|
498
516
|
jniEnv->CallVoidMethod(
|
|
499
|
-
|
|
517
|
+
jniObj,
|
|
500
518
|
mid,
|
|
501
519
|
jobId
|
|
502
520
|
);
|
|
@@ -588,7 +606,7 @@ void RNFSTurboPlatformHelper::uploadFiles(
|
|
|
588
606
|
}
|
|
589
607
|
|
|
590
608
|
jniEnv->CallVoidMethod(
|
|
591
|
-
|
|
609
|
+
jniObj,
|
|
592
610
|
mid,
|
|
593
611
|
jobId,
|
|
594
612
|
jniEnv->NewStringUTF(toUrl),
|
|
@@ -618,7 +636,7 @@ void RNFSTurboPlatformHelper::stopUpload(int jobId) {
|
|
|
618
636
|
);
|
|
619
637
|
|
|
620
638
|
jniEnv->CallVoidMethod(
|
|
621
|
-
|
|
639
|
+
jniObj,
|
|
622
640
|
mid,
|
|
623
641
|
jobId
|
|
624
642
|
);
|
|
@@ -627,8 +645,8 @@ void RNFSTurboPlatformHelper::stopUpload(int jobId) {
|
|
|
627
645
|
|
|
628
646
|
FSInfo RNFSTurboPlatformHelper::getFSInfo() {
|
|
629
647
|
jclass jniCls = jniEnv->GetObjectClass(jniObj);
|
|
630
|
-
jmethodID mid = jniEnv->
|
|
631
|
-
jobject infoArr = jniEnv->CallObjectMethod(
|
|
648
|
+
jmethodID mid = jniEnv->GetMethodID(jniCls, "getFSInfo", "()[J");
|
|
649
|
+
jobject infoArr = jniEnv->CallObjectMethod(jniObj, mid);
|
|
632
650
|
jlongArray *infoLongArr = reinterpret_cast<jlongArray*>(&infoArr);
|
|
633
651
|
jlong* infoData = jniEnv->GetLongArrayElements(*infoLongArr, NULL);
|
|
634
652
|
|
|
@@ -640,8 +658,8 @@ FSInfo RNFSTurboPlatformHelper::getFSInfo() {
|
|
|
640
658
|
};
|
|
641
659
|
|
|
642
660
|
jniEnv->ReleaseLongArrayElements(*infoLongArr, infoData, 0);
|
|
643
|
-
jniEnv->DeleteLocalRef(infoArr);
|
|
644
661
|
jniEnv->DeleteLocalRef(jniCls);
|
|
662
|
+
jniEnv->DeleteLocalRef(infoArr);
|
|
645
663
|
|
|
646
664
|
return fsInfo;
|
|
647
665
|
}
|
|
@@ -661,6 +679,7 @@ void RNFSTurboPlatformHelper::scanFile(int jobId, const char *path, RNFSTurboSca
|
|
|
661
679
|
jobId,
|
|
662
680
|
jniEnv->NewStringUTF(path)
|
|
663
681
|
);
|
|
682
|
+
jniEnv->DeleteLocalRef(jniCls);
|
|
664
683
|
if (jniEnv->ExceptionCheck()) {
|
|
665
684
|
jniEnv->ExceptionClear();
|
|
666
685
|
std::map<int, RNFSTurboScanCallback>::iterator it = RNFSTurboPlatformHelper::scanCallbacks.find(jobId);
|
|
@@ -669,7 +688,6 @@ void RNFSTurboPlatformHelper::scanFile(int jobId, const char *path, RNFSTurboSca
|
|
|
669
688
|
}
|
|
670
689
|
throw "Scan error";
|
|
671
690
|
}
|
|
672
|
-
jniEnv->DeleteLocalRef(jniCls);
|
|
673
691
|
}
|
|
674
692
|
|
|
675
693
|
std::vector<std::string> RNFSTurboPlatformHelper::getAllExternalFilesDirs() {
|
|
@@ -223,12 +223,15 @@ public class RNFSTurboPlatformHelper {
|
|
|
223
223
|
|
|
224
224
|
params.onTaskCompleted = new RNFSTurboDownloadParams.OnTaskCompleted() {
|
|
225
225
|
public void onTaskCompleted(RNFSTurboDownloadResult res) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
226
|
+
RNFSTurboDownloader downloader = downloaders.get(jobId);
|
|
227
|
+
if (downloader != null) {
|
|
228
|
+
if (res.exception == null) {
|
|
229
|
+
downloadCompleteCallback(jobId, res.statusCode, (double)res.bytesWritten);
|
|
230
|
+
} else {
|
|
231
|
+
downloadErrorCallback(jobId, res.exception.toString());
|
|
232
|
+
}
|
|
233
|
+
downloaders.remove(jobId);
|
|
230
234
|
}
|
|
231
|
-
downloaders.remove(jobId);
|
|
232
235
|
}
|
|
233
236
|
};
|
|
234
237
|
|
|
@@ -236,7 +239,10 @@ public class RNFSTurboPlatformHelper {
|
|
|
236
239
|
params.onDownloadBegin = new RNFSTurboDownloadParams.OnDownloadBegin() {
|
|
237
240
|
@Override
|
|
238
241
|
public void onDownloadBegin(int statusCode, long contentLength, Map<String, String> headers) {
|
|
239
|
-
|
|
242
|
+
RNFSTurboDownloader downloader = downloaders.get(jobId);
|
|
243
|
+
if (downloader != null) {
|
|
244
|
+
downloadBeginCallback(jobId, statusCode, (double)contentLength, new HashMap<String, String>(headers));
|
|
245
|
+
}
|
|
240
246
|
}
|
|
241
247
|
};
|
|
242
248
|
}
|
|
@@ -244,7 +250,10 @@ public class RNFSTurboPlatformHelper {
|
|
|
244
250
|
if (hasProgressCallback) {
|
|
245
251
|
params.onDownloadProgress = new RNFSTurboDownloadParams.OnDownloadProgress() {
|
|
246
252
|
public void onDownloadProgress(long contentLength, long bytesWritten) {
|
|
247
|
-
|
|
253
|
+
RNFSTurboDownloader downloader = downloaders.get(jobId);
|
|
254
|
+
if (downloader != null) {
|
|
255
|
+
downloadProgressCallback(jobId, (double)contentLength, (double)bytesWritten);
|
|
256
|
+
}
|
|
248
257
|
}
|
|
249
258
|
};
|
|
250
259
|
}
|
|
@@ -11,12 +11,13 @@
|
|
|
11
11
|
namespace facebook::react {
|
|
12
12
|
|
|
13
13
|
NativeRNFSTurboModule::NativeRNFSTurboModule(std::shared_ptr<CallInvoker> jsInvoker)
|
|
14
|
-
: NativeRNFSTurboModuleCxxSpec(jsInvoker) {}
|
|
14
|
+
: NativeRNFSTurboModuleCxxSpec(std::move(jsInvoker)) {}
|
|
15
15
|
|
|
16
16
|
NativeRNFSTurboModule::~NativeRNFSTurboModule() {}
|
|
17
17
|
|
|
18
18
|
jsi::Object NativeRNFSTurboModule::createRNFSTurbo(jsi::Runtime& runtime) {
|
|
19
19
|
auto instance = std::make_shared<RNFSTurboHostObject>();
|
|
20
|
+
instance->jsInvoker = jsInvoker_;
|
|
20
21
|
return jsi::Object::createFromHostObject(runtime, instance);
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -36,7 +36,7 @@ jsi::Value RNFSTurboHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID
|
|
|
36
36
|
std::string propName = propNameId.utf8(runtime);
|
|
37
37
|
|
|
38
38
|
RNFSTurboLogger::log("RNFSTurbo", "call func %s...", propName.c_str());
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
if (propName == "stat") {
|
|
41
41
|
return jsi::Function::createFromHostFunction(
|
|
42
42
|
runtime, jsi::PropNameID::forAscii(runtime, propName),
|
|
@@ -1139,47 +1139,57 @@ jsi::Value RNFSTurboHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID
|
|
|
1139
1139
|
RNFSTurboPlatformHelper::jobId += 1;
|
|
1140
1140
|
int jobId = RNFSTurboPlatformHelper::jobId;
|
|
1141
1141
|
|
|
1142
|
-
RNFSTurboCompleteDownloadCallback completeCallback = [&runtime, completeFunc](int jobId, int statusCode, float bytesWritten) -> void {
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1142
|
+
RNFSTurboCompleteDownloadCallback completeCallback = [&runtime, completeFunc, this](int jobId, int statusCode, float bytesWritten) -> void {
|
|
1143
|
+
jsInvoker->invokeAsync([&runtime, completeFunc, jobId, statusCode, bytesWritten]() {
|
|
1144
|
+
jsi::Object result = jsi::Object(runtime);
|
|
1145
|
+
result.setProperty(runtime, "jobId", jsi::Value(jobId));
|
|
1146
|
+
result.setProperty(runtime, "statusCode", jsi::Value(statusCode));
|
|
1147
|
+
result.setProperty(runtime, "bytesWritten", jsi::Value(bytesWritten));
|
|
1148
|
+
completeFunc->call(runtime, std::move(result));
|
|
1149
|
+
});
|
|
1148
1150
|
};
|
|
1149
1151
|
|
|
1150
|
-
RNFSTurboErrorCallback errorCallback = [&runtime, errorFunc](int jobId, const char* errorMessage) -> void {
|
|
1151
|
-
|
|
1152
|
+
RNFSTurboErrorCallback errorCallback = [&runtime, errorFunc, this](int jobId, const char* errorMessage) -> void {
|
|
1153
|
+
jsInvoker->invokeAsync([&runtime, errorFunc, jobId, errorMessage]() {
|
|
1154
|
+
errorFunc->call(runtime, jsi::String::createFromUtf8(runtime, RNFSTurboLogger::sprintf("%s: %s", "downloadFile", errorMessage)));
|
|
1155
|
+
});
|
|
1152
1156
|
};
|
|
1153
1157
|
|
|
1154
1158
|
std::optional<RNFSTurboBeginDownloadCallback> beginCallback = std::nullopt;
|
|
1155
1159
|
if (beginCallbackFunc) {
|
|
1156
|
-
beginCallback = [&runtime, beginCallbackFunc](int jobId, int statusCode, float contentLength, std::map<std::string, std::string> headers) -> void {
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1160
|
+
beginCallback = [&runtime, beginCallbackFunc, this](int jobId, int statusCode, float contentLength, std::map<std::string, std::string> headers) -> void {
|
|
1161
|
+
jsInvoker->invokeAsync([&runtime, beginCallbackFunc, jobId, statusCode, contentLength, headers]() {
|
|
1162
|
+
jsi::Object result = jsi::Object(runtime);
|
|
1163
|
+
result.setProperty(runtime, "jobId", jsi::Value(jobId));
|
|
1164
|
+
result.setProperty(runtime, "statusCode", jsi::Value(statusCode));
|
|
1165
|
+
result.setProperty(runtime, "contentLength", jsi::Value(contentLength));
|
|
1166
|
+
jsi::Object jsHeaders = jsi::Object(runtime);
|
|
1167
|
+
for (auto const& [key, val] : headers) {
|
|
1168
|
+
jsHeaders.setProperty(runtime, key.c_str(), jsi::String::createFromUtf8(runtime, val));
|
|
1169
|
+
}
|
|
1170
|
+
result.setProperty(runtime, "headers", jsHeaders);
|
|
1171
|
+
beginCallbackFunc->call(runtime, std::move(result));
|
|
1172
|
+
});
|
|
1167
1173
|
};
|
|
1168
1174
|
}
|
|
1169
1175
|
std::optional<RNFSTurboProgressDownloadCallback> progressCallback = std::nullopt;
|
|
1170
1176
|
if (progressCallbackFunc) {
|
|
1171
|
-
progressCallback = [&runtime, progressCallbackFunc](int jobId, float contentLength, float bytesWritten) -> void {
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
+
progressCallback = [&runtime, progressCallbackFunc, this](int jobId, float contentLength, float bytesWritten) -> void {
|
|
1178
|
+
jsInvoker->invokeAsync([&runtime, progressCallbackFunc, jobId, contentLength, bytesWritten]() {
|
|
1179
|
+
jsi::Object result = jsi::Object(runtime);
|
|
1180
|
+
result.setProperty(runtime, "jobId", jsi::Value(jobId));
|
|
1181
|
+
result.setProperty(runtime, "contentLength", jsi::Value(contentLength));
|
|
1182
|
+
result.setProperty(runtime, "bytesWritten", jsi::Value(bytesWritten));
|
|
1183
|
+
progressCallbackFunc->call(runtime, std::move(result));
|
|
1184
|
+
});
|
|
1177
1185
|
};
|
|
1178
1186
|
}
|
|
1179
1187
|
std::optional<RNFSTurboResumableDownloadCallback> resumableCallback = std::nullopt;
|
|
1180
1188
|
if (resumableCallbackFunc) {
|
|
1181
|
-
resumableCallback = [&runtime, resumableCallbackFunc](int jobId) -> void {
|
|
1182
|
-
|
|
1189
|
+
resumableCallback = [&runtime, resumableCallbackFunc, this](int jobId) -> void {
|
|
1190
|
+
jsInvoker->invokeAsync([&runtime, resumableCallbackFunc, jobId]() {
|
|
1191
|
+
resumableCallbackFunc->call(runtime, jsi::Value(jobId));
|
|
1192
|
+
});
|
|
1183
1193
|
};
|
|
1184
1194
|
}
|
|
1185
1195
|
|
|
@@ -1428,26 +1438,32 @@ jsi::Value RNFSTurboHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID
|
|
|
1428
1438
|
completeFunc->call(runtime, std::move(result));
|
|
1429
1439
|
};
|
|
1430
1440
|
|
|
1431
|
-
RNFSTurboErrorCallback errorCallback = [&runtime, errorFunc](int jobId, const char* errorMessage) -> void {
|
|
1432
|
-
|
|
1441
|
+
RNFSTurboErrorCallback errorCallback = [&runtime, errorFunc, this](int jobId, const char* errorMessage) -> void {
|
|
1442
|
+
jsInvoker->invokeAsync([&runtime, errorFunc, errorMessage]() {
|
|
1443
|
+
errorFunc->call(runtime, jsi::String::createFromUtf8(runtime, RNFSTurboLogger::sprintf("%s: %s", "uploadFiles", errorMessage)));
|
|
1444
|
+
});
|
|
1433
1445
|
};
|
|
1434
1446
|
|
|
1435
1447
|
std::optional<RNFSTurboBeginUploadCallback> beginCallback = std::nullopt;
|
|
1436
1448
|
if (beginCallbackFunc) {
|
|
1437
|
-
beginCallback = [&runtime, beginCallbackFunc](int jobId) -> void {
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1449
|
+
beginCallback = [&runtime, beginCallbackFunc, this](int jobId) -> void {
|
|
1450
|
+
jsInvoker->invokeAsync([&runtime, beginCallbackFunc, jobId]() {
|
|
1451
|
+
jsi::Object result = jsi::Object(runtime);
|
|
1452
|
+
result.setProperty(runtime, "jobId", jsi::Value(jobId));
|
|
1453
|
+
beginCallbackFunc->call(runtime, std::move(result));
|
|
1454
|
+
});
|
|
1441
1455
|
};
|
|
1442
1456
|
}
|
|
1443
1457
|
std::optional<RNFSTurboProgressUploadCallback> progressCallback = std::nullopt;
|
|
1444
1458
|
if (progressCallbackFunc) {
|
|
1445
|
-
progressCallback = [&runtime, progressCallbackFunc](int jobId, float totalBytesExpectedToSend, float totalBytesSent) -> void {
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1459
|
+
progressCallback = [&runtime, progressCallbackFunc, this](int jobId, float totalBytesExpectedToSend, float totalBytesSent) -> void {
|
|
1460
|
+
jsInvoker->invokeAsync([&runtime, progressCallbackFunc, jobId, totalBytesExpectedToSend, totalBytesSent]() {
|
|
1461
|
+
jsi::Object result = jsi::Object(runtime);
|
|
1462
|
+
result.setProperty(runtime, "jobId", jsi::Value(jobId));
|
|
1463
|
+
result.setProperty(runtime, "totalBytesExpectedToSend", jsi::Value(totalBytesExpectedToSend));
|
|
1464
|
+
result.setProperty(runtime, "totalBytesSent", jsi::Value(totalBytesSent));
|
|
1465
|
+
progressCallbackFunc->call(runtime, std::move(result));
|
|
1466
|
+
});
|
|
1451
1467
|
};
|
|
1452
1468
|
}
|
|
1453
1469
|
|
|
@@ -1544,11 +1560,13 @@ jsi::Value RNFSTurboHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID
|
|
|
1544
1560
|
RNFSTurboPlatformHelper::jobId += 1;
|
|
1545
1561
|
int jobId = RNFSTurboPlatformHelper::jobId;
|
|
1546
1562
|
|
|
1547
|
-
RNFSTurboScanCallback scanCallback = [&runtime, scanFunc](int jobId, std::string path) -> void {
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1563
|
+
RNFSTurboScanCallback scanCallback = [&runtime, scanFunc, this](int jobId, std::string path) -> void {
|
|
1564
|
+
jsInvoker->invokeAsync([&runtime, scanFunc, jobId, path]() {
|
|
1565
|
+
jsi::Object result = jsi::Object(runtime);
|
|
1566
|
+
result.setProperty(runtime, "jobId", jsi::Value(jobId));
|
|
1567
|
+
result.setProperty(runtime, "path", jsi::String::createFromUtf8(runtime, path));
|
|
1568
|
+
scanFunc->call(runtime, std::move(result));
|
|
1569
|
+
});
|
|
1552
1570
|
};
|
|
1553
1571
|
|
|
1554
1572
|
try {
|
|
@@ -1556,10 +1574,10 @@ jsi::Value RNFSTurboHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID
|
|
|
1556
1574
|
} catch (const char* error_message) {
|
|
1557
1575
|
throw jsi::JSError(runtime, RNFSTurboLogger::sprintf("%s: %s", "scanFile", error_message));
|
|
1558
1576
|
}
|
|
1577
|
+
return jsi::Value(jobId);
|
|
1559
1578
|
#else
|
|
1560
1579
|
throw jsi::JSError(runtime, RNFSTurboLogger::sprintf("%s: %s", "scanFile", "Command only for Android"));
|
|
1561
1580
|
#endif
|
|
1562
|
-
return jsi::Value::undefined();
|
|
1563
1581
|
}
|
|
1564
1582
|
);
|
|
1565
1583
|
}
|
|
@@ -42,6 +42,7 @@ public:
|
|
|
42
42
|
public:
|
|
43
43
|
jsi::Value get(jsi::Runtime&, const jsi::PropNameID& name) override;
|
|
44
44
|
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& rt) override;
|
|
45
|
+
std::shared_ptr<facebook::react::CallInvoker> jsInvoker;
|
|
45
46
|
|
|
46
47
|
private:
|
|
47
48
|
RNFSTurboPlatformHelper* platformHelper;
|
|
@@ -58,7 +58,6 @@ struct DownloadCallbacks {
|
|
|
58
58
|
RNFSTurboBeginDownloadCallback beginCallback;
|
|
59
59
|
RNFSTurboProgressDownloadCallback progressCallback;
|
|
60
60
|
RNFSTurboResumableDownloadCallback resumableCallback;
|
|
61
|
-
std::chrono::time_point<std::chrono::steady_clock> lastProgressCall{ std::chrono::steady_clock::now() };
|
|
62
61
|
};
|
|
63
62
|
|
|
64
63
|
struct UploadCallbacks {
|
|
@@ -66,7 +65,6 @@ struct UploadCallbacks {
|
|
|
66
65
|
RNFSTurboErrorCallback errorCallback;
|
|
67
66
|
RNFSTurboBeginUploadCallback beginCallback;
|
|
68
67
|
RNFSTurboProgressUploadCallback progressCallback;
|
|
69
|
-
std::chrono::time_point<std::chrono::steady_clock> lastProgressCall{ std::chrono::steady_clock::now() };
|
|
70
68
|
};
|
|
71
69
|
|
|
72
70
|
class RNFSTurboPlatformHelper {
|
package/package.json
CHANGED