Skip to content

Commit 7064252

Browse files
author
pioner921227
committed
initial_commit
1 parent d0a227f commit 7064252

File tree

32 files changed

+1161
-47853
lines changed

32 files changed

+1161
-47853
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,6 @@ android/generated
8484

8585
# React Native Nitro Modules
8686
nitrogen/
87+
88+
rust/fetcher-rust/target
89+
rust/fetcher-rust/ios/universal

SyncTasks.podspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Pod::Spec.new do |s|
1414
s.source = { :git => "https://github.com/pioner92/react-native-sync-tasks.git", :tag => "#{s.version}" }
1515

1616
s.source_files = "ios/**/*.{h,m,mm}", "cpp/**/*.{hpp,cpp,c,h}"
17+
s.vendored_frameworks = 'ios/rust/fetcher.xcframework'
18+
1719

1820
# Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
1921
# See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.

android/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ add_library(rnsynctasks SHARED
1212
../cpp/JSTask.cpp
1313
../cpp/JSManager.hpp
1414
../cpp/JSManager.cpp
15-
../cpp/helpers/helpers.h
15+
../cpp/helpers/helpers.hpp
16+
../cpp/helpers/FetchService.cpp
17+
../cpp/helpers/FetchService.hpp
1618
cpp-adapter.cpp
1719
)
1820

android/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
155155
dependencies {
156156
implementation "com.facebook.react:react-android"
157157
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
158+
implementation("com.squareup.okhttp3:okhttp:4.12.0")
158159
}
159160

160161
if (isNewArchitectureEnabled()) {

android/cpp-adapter.cpp

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,60 @@
77
#include <fbjni/detail/Registration.h>
88
#include <typeinfo>
99
#include "react-native-sync-tasks.hpp"
10+
#include "helpers/FetchService.hpp"
1011

1112

1213
using namespace facebook;
1314

15+
JavaVM* g_vm = nullptr;
16+
jobject g_classLoader = nullptr;
17+
jmethodID g_loadClass = nullptr;
18+
19+
JNIEnv* getJNIEnv() {
20+
JNIEnv* env = nullptr;
21+
if (g_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
22+
// Поток не прикреплён — нужно attach
23+
g_vm->AttachCurrentThread(&env, nullptr);
24+
}
25+
return env;
26+
}
27+
28+
extern "C"
29+
JNIEXPORT void JNICALL
30+
Java_com_synctasks_SyncTasksModule_nativeSetClassLoader(JNIEnv* env, jclass, jobject classLoader) {
31+
g_classLoader = env->NewGlobalRef(classLoader);
32+
jclass classLoaderClass = env->FindClass("java/lang/ClassLoader");
33+
g_loadClass = env->GetMethodID(classLoaderClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
34+
}
35+
36+
void setupClassLoader(JNIEnv* env) {
37+
jclass contextClass = env->FindClass("com/synctasks/SyncTasksModule");
38+
jclass classClass = env->FindClass("java/lang/Class");
39+
jmethodID getClassLoader = env->GetMethodID(classClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
40+
jobject classLoader = env->CallObjectMethod(contextClass, getClassLoader);
41+
g_classLoader = env->NewGlobalRef(classLoader);
42+
43+
jclass classLoaderClass = env->FindClass("java/lang/ClassLoader");
44+
g_loadClass = env->GetMethodID(classLoaderClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
45+
}
46+
47+
jclass findClassSafe(JNIEnv* env, const char* name) {
48+
if (!g_classLoader || !g_loadClass) {
49+
__android_log_print(ANDROID_LOG_ERROR, "SYNC_TASKS", "ClassLoader not initialized");
50+
return nullptr;
51+
}
52+
jstring strClassName = env->NewStringUTF(name);
53+
jclass clazz = (jclass)env->CallObjectMethod(g_classLoader, g_loadClass, strClassName);
54+
env->DeleteLocalRef(strClassName);
55+
56+
if (env->ExceptionCheck()) {
57+
env->ExceptionDescribe();
58+
env->ExceptionClear();
59+
return nullptr;
60+
}
61+
return clazz;
62+
}
63+
1464
struct SyncTasksBridge : jni::JavaClass<SyncTasksBridge> {
1565
public:
1666
static constexpr auto kJavaDescriptor = "Lcom/synctasks/SyncTasksModule;";
@@ -29,14 +79,70 @@ struct SyncTasksBridge : jni::JavaClass<SyncTasksBridge> {
2979
auto jsiRuntime = reinterpret_cast<jsi::Runtime*>(jsiRuntimePointer);
3080
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
3181

82+
auto fetch = [](std::string&& url, FetchHeaders&& headers) -> FetchResponse {
83+
JNIEnv* env = getJNIEnv();
84+
85+
jclass fetcherClass = findClassSafe(env, "com.synctasks.Fetcher");
86+
if (!fetcherClass) {
87+
return FetchError{"Fetcher class not found", "", 0};
88+
}
3289

33-
sh::synctasks::install(jsiRuntime, jsCallInvoker);
90+
jmethodID fetchMethod = env->GetStaticMethodID(fetcherClass, "fetch", "(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/String;");
91+
if (!fetchMethod) {
92+
return FetchError{"Fetcher.fetch() not found", "", 0};
93+
}
3494

35-
// Установите JSI
36-
// sqldb::install(jsiRuntime, jsCallInvoker, dbPathStr);
95+
jstring jUrl = env->NewStringUTF(url.c_str());
96+
97+
jclass mapClass = env->FindClass("java/util/HashMap");
98+
jmethodID init = env->GetMethodID(mapClass, "<init>", "()V");
99+
jobject jMap = env->NewObject(mapClass, init);
100+
101+
jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
102+
103+
for (const auto& [k, v] : headers) {
104+
jstring jk = env->NewStringUTF(k.c_str());
105+
jstring jv = env->NewStringUTF(v.c_str());
106+
env->CallObjectMethod(jMap, put, jk, jv);
107+
env->DeleteLocalRef(jk);
108+
env->DeleteLocalRef(jv);
109+
}
110+
111+
jstring jResult = (jstring)env->CallStaticObjectMethod(fetcherClass, fetchMethod, jUrl, jMap);
112+
113+
// jclass pairClass = env->FindClass("kotlin/Pair");
114+
// jmethodID getFirst = env->GetMethodID(pairClass, "getFirst", "()Ljava/lang/Object;");
115+
// jmethodID getSecond = env->GetMethodID(pairClass, "getSecond", "()Ljava/lang/Object;");
116+
117+
118+
// jobject jCodeObj = env->CallObjectMethod(resultPair, getFirst);
119+
// jobject jBodyObj = env->CallObjectMethod(resultPair, getSecond);
120+
121+
// const char* cstr = env->GetStringUTFChars(jResult, nullptr);
122+
// std::string body(cstr);
123+
// env->ReleaseStringUTFChars(jResult, cstr);
124+
//
125+
// env->DeleteLocalRef(jUrl);
126+
// env->DeleteLocalRef(jMap);
127+
// env->DeleteLocalRef(jResult);
128+
// env->DeleteLocalRef(fetcherClass);
129+
130+
return FetchBody("");
131+
};
132+
133+
sh::synctasks::install(jsiRuntime, jsCallInvoker,std::move(fetch));
37134
}
38135
};
39136

40137
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) {
138+
g_vm = vm;
139+
140+
JNIEnv* env = nullptr;
141+
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
142+
return JNI_ERR;
143+
}
144+
145+
setupClassLoader(env);
146+
41147
return jni::initialize(vm, [] { SyncTasksBridge::registerNatives(); });
42148
}

android/src/main/java/com/synctasks/SyncTasksModule.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,27 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule
66
import com.facebook.react.bridge.ReactMethod
77
import com.facebook.react.common.annotations.FrameworkAPI
88
import com.facebook.react.turbomodule.core.CallInvokerHolderImpl
9+
import okhttp3.OkHttpClient
10+
import okhttp3.Request
11+
12+
13+
object Fetcher {
14+
@JvmStatic
15+
fun fetch(url: String, headers: Map<String, String>): String {
16+
val client = OkHttpClient()
17+
18+
val builder = Request.Builder()
19+
.url(url)
20+
21+
headers.forEach { (k, v) -> builder.addHeader(k, v) }
22+
23+
val response = client.newCall(builder.build()).execute()
24+
25+
val body = response.body?.string() ?: ""
26+
27+
return body;
28+
}
29+
}
930

1031
@OptIn(FrameworkAPI::class)
1132
class SyncTasksModule internal constructor(val context: ReactApplicationContext) :

cpp/JSManager.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
//
77

88
#include "JSManager.hpp"
9-
#include "TaskScheduler.hpp"
9+
#include "core/TaskScheduler.hpp"
1010
#include "constants.hpp"
11-
#include "helpers/helpers.h"
11+
#include "helpers/helpers.hpp"
1212

1313
jsi::Object createJSTaskManager(jsi::Runtime& rt) {
1414
jsi::Object taskManagerJS = jsi::Object(rt);
@@ -19,10 +19,12 @@ jsi::Object createJSTaskManager(jsi::Runtime& rt) {
1919
rt, jsi::PropNameID::forAscii(rt, ADD_TASK_KEY), 1,
2020
[t_manager](jsi::Runtime& rt, const jsi::Value& thisVal,
2121
const jsi::Value* args, size_t count) {
22-
std::shared_ptr<Task> task =
23-
args[0].asObject(rt).getNativeState<Task>(rt);
2422

25-
t_manager->addTask(std::move(task));
23+
if(!args[0].isObject() || !args[0].asObject(rt).hasNativeState<Task>(rt)){
24+
throw jsi::JSError(rt, createErrorString("addTask -> Invalid argument").data());
25+
}
26+
27+
t_manager->addTask(args[0].asObject(rt).getNativeState<Task>(rt));
2628

2729
return jsi::Value(true);
2830
});
@@ -32,16 +34,20 @@ jsi::Object createJSTaskManager(jsi::Runtime& rt) {
3234
[t_manager](jsi::Runtime& rt, const jsi::Value& thisVal,
3335
const jsi::Value* args, size_t count) {
3436
if (!checkJSType<jsi::Array>(rt, args[0])) {
35-
throw jsi::JSError(
36-
rt, "[SyncTasksManager]: addTasks -> Argument must be an array");
37+
throw jsi::JSError(rt, createErrorString("addTasks -> Argument must be an array").data());
3738
}
3839

3940
jsi::Array jsTasks = args[0].asObject(rt).asArray(rt);
4041

4142
for (int i = 0; i < jsTasks.length(rt); ++i) {
42-
std::shared_ptr<Task> task =
43-
jsTasks.getValueAtIndex(rt, i).asObject(rt).getNativeState<Task>(
44-
rt);
43+
44+
jsi::Value taskValue = jsTasks.getValueAtIndex(rt, i);
45+
46+
if(!taskValue.isObject() || !taskValue.asObject(rt).hasNativeState<Task>(rt)){
47+
throw jsi::JSError(rt, createErrorString("addTasks -> Invalid argument").data());
48+
}
49+
50+
std::shared_ptr<Task> task = taskValue.asObject(rt).getNativeState<Task>(rt);
4551

4652
t_manager->addTask(std::move(task));
4753
}

0 commit comments

Comments
 (0)