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 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 => package["repository"], :tag => "#{s.version}" }
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
- return;
16
+ env->DeleteLocalRef(hashMap);
17
+ return;
17
18
  }
18
19
  jmethodID entrySet =
19
- env->GetMethodID(mapClass, "entrySet", "()Ljava/util/Set;");
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
- env->GetMethodID(setClass, "iterator", "()Ljava/util/Iterator;");
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
- env->GetMethodID(iteratorClass, "next", "()Ljava/lang/Object;");
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
- env->GetMethodID(entryClass, "getKey", "()Ljava/lang/Object;");
62
- if (getKey == nullptr) {
63
- return;
64
- }
91
+ env->GetMethodID(entryClass, "getKey", "()Ljava/lang/Object;");
65
92
  jmethodID getValue =
66
- env->GetMethodID(entryClass, "getValue", "()Ljava/lang/Object;");
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 callback = RNFSTurboPlatformHelper::downloadCallbacks.find(jobId);
172
- if (callback != RNFSTurboPlatformHelper::downloadCallbacks.end()) {
173
- const auto now = std::chrono::steady_clock::now();
174
- const auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(
175
- now - RNFSTurboPlatformHelper::downloadCallbacks[jobId].lastProgressCall
176
- ).count();
177
- if (elapsedTime > 50) {
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 callback = RNFSTurboPlatformHelper::uploadCallbacks.find(jobId);
237
- if (callback != RNFSTurboPlatformHelper::uploadCallbacks.end()) {
238
- const auto now = std::chrono::steady_clock::now();
239
- const auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(
240
- now - RNFSTurboPlatformHelper::uploadCallbacks[jobId].lastProgressCall
241
- ).count();
242
- if (elapsedTime > 50) {
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
- jniCls,
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
- jniCls,
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
- jniCls,
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
- jniCls,
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->GetStaticMethodID(jniCls, "getFSInfo", "()[J");
631
- jobject infoArr = jniEnv->CallObjectMethod(jniCls, mid);
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
- if (res.exception == null) {
227
- downloadCompleteCallback(jobId, res.statusCode, (double)res.bytesWritten);
228
- } else {
229
- downloadErrorCallback(jobId, res.exception.toString());
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
- downloadBeginCallback(jobId, statusCode, (double)contentLength, new HashMap<String, String>(headers));
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
- downloadProgressCallback(jobId, (double)contentLength, (double)bytesWritten);
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
- jsi::Object result = jsi::Object(runtime);
1144
- result.setProperty(runtime, "jobId", jsi::Value(jobId));
1145
- result.setProperty(runtime, "statusCode", jsi::Value(statusCode));
1146
- result.setProperty(runtime, "bytesWritten", jsi::Value(bytesWritten));
1147
- completeFunc->call(runtime, std::move(result));
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
- errorFunc->call(runtime, jsi::String::createFromUtf8(runtime, RNFSTurboLogger::sprintf("%s: %s", "downloadFile", errorMessage)));
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
- jsi::Object result = jsi::Object(runtime);
1158
- result.setProperty(runtime, "jobId", jsi::Value(jobId));
1159
- result.setProperty(runtime, "statusCode", jsi::Value(statusCode));
1160
- result.setProperty(runtime, "contentLength", jsi::Value(contentLength));
1161
- jsi::Object jsHeaders = jsi::Object(runtime);
1162
- for (auto const& [key, val] : headers) {
1163
- jsHeaders.setProperty(runtime, key.c_str(), jsi::String::createFromUtf8(runtime, val));
1164
- }
1165
- result.setProperty(runtime, "headers", jsHeaders);
1166
- beginCallbackFunc->call(runtime, std::move(result));
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
- jsi::Object result = jsi::Object(runtime);
1173
- result.setProperty(runtime, "jobId", jsi::Value(jobId));
1174
- result.setProperty(runtime, "contentLength", jsi::Value(contentLength));
1175
- result.setProperty(runtime, "bytesWritten", jsi::Value(bytesWritten));
1176
- progressCallbackFunc->call(runtime, std::move(result));
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
- resumableCallbackFunc->call(runtime, jsi::Value(jobId));
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
- errorFunc->call(runtime, jsi::String::createFromUtf8(runtime, RNFSTurboLogger::sprintf("%s: %s", "uploadFiles", errorMessage)));
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
- jsi::Object result = jsi::Object(runtime);
1439
- result.setProperty(runtime, "jobId", jsi::Value(jobId));
1440
- beginCallbackFunc->call(runtime, std::move(result));
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
- jsi::Object result = jsi::Object(runtime);
1447
- result.setProperty(runtime, "jobId", jsi::Value(jobId));
1448
- result.setProperty(runtime, "totalBytesExpectedToSend", jsi::Value(totalBytesExpectedToSend));
1449
- result.setProperty(runtime, "totalBytesSent", jsi::Value(totalBytesSent));
1450
- progressCallbackFunc->call(runtime, std::move(result));
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
- jsi::Object result = jsi::Object(runtime);
1549
- result.setProperty(runtime, "jobId", jsi::Value(jobId));
1550
- result.setProperty(runtime, "path", jsi::String::createFromUtf8(runtime, path));
1551
- scanFunc->call(runtime, std::move(result));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-fs-turbo",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "React-Native library for working with Android/iOS file system, written using JSI and C++ TurboModules",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",