diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.h b/native/cpp/CommonCpp/NativeModules/CommCoreModule.h --- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.h +++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.h @@ -14,8 +14,6 @@ class CommCoreModule : public facebook::react::CommCoreModuleSchemaCxxSpecJSI { const int codeVersion{147}; - - std::unique_ptr databaseThread; std::unique_ptr cryptoThread; CommSecureStore secureStore; diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp --- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp +++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp @@ -1,6 +1,7 @@ #include "CommCoreModule.h" #include "DatabaseManager.h" #include "GRPCStreamHostObject.h" +#include "InternalModules/GlobalDBSingleton.h" #include "InternalModules/GlobalNetworkSingleton.h" #include "InternalModules/NetworkModule.h" #include "Logger.h" @@ -23,7 +24,7 @@ jsi::Runtime &rt, std::function task) { std::promise promise; - this->databaseThread->scheduleTask([&promise, &task]() { + GlobalDBSingleton::instance.scheduleOrRun([&promise, &task]() { try { promise.set_value(task()); } catch (const std::exception &e) { @@ -61,7 +62,7 @@ promise->resolve(std::move(draft)); }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -86,7 +87,7 @@ } }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -116,7 +117,7 @@ } }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -156,7 +157,7 @@ promise->resolve(std::move(jsiDrafts)); }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -178,7 +179,7 @@ promise->resolve(jsi::Value::undefined()); }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -308,7 +309,7 @@ promise->resolve(std::move(jsiMessages)); }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -399,7 +400,7 @@ } }); }; - this->databaseThread->scheduleTask(job); + GlobalDBSingleton::instance.scheduleOrRun(job); }); } @@ -419,7 +420,7 @@ return false; } - this->databaseThread->scheduleTask( + GlobalDBSingleton::instance.scheduleOrRun( [=, &messageStoreOps, &operationsResult, &rt]() { std::string error = operationsError; if (!error.size()) { @@ -442,7 +443,7 @@ jsi::Value CommCoreModule::getAllThreads(jsi::Runtime &rt) { return createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([=, &innerRt]() { + GlobalDBSingleton::instance.scheduleOrRun([=, &innerRt]() { std::string error; std::vector threadsVector; size_t numThreads; @@ -705,7 +706,7 @@ } return createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([=]() { + GlobalDBSingleton::instance.scheduleOrRun([=]() { std::string error = operationsError; if (!error.size()) { try { @@ -743,7 +744,7 @@ } catch (std::runtime_error &e) { return false; } - this->databaseThread->scheduleTask( + GlobalDBSingleton::instance.scheduleOrRun( [=, &threadStoreOps, &operationsResult, &rt]() { std::string error = operationsError; if (!error.size()) { @@ -777,7 +778,7 @@ return createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([=]() { + GlobalDBSingleton::instance.scheduleOrRun([=]() { crypto::Persist persist; std::string error; try { @@ -809,7 +810,7 @@ if (persist.isEmpty()) { crypto::Persist newPersist = this->cryptoModule->storeAsB64(storedSecretKey.value()); - this->databaseThread->scheduleTask([=]() { + GlobalDBSingleton::instance.scheduleOrRun([=]() { std::string error; try { DatabaseManager::getQueryExecutor().storeOlmPersistData( @@ -908,8 +909,8 @@ CommCoreModule::CommCoreModule( std::shared_ptr jsInvoker) : facebook::react::CommCoreModuleSchemaCxxSpecJSI(jsInvoker), - databaseThread(std::make_unique("database")), cryptoThread(std::make_unique("crypto")) { + GlobalDBSingleton::instance.enableMultithreading(); GlobalNetworkSingleton::instance.enableMultithreading(); } @@ -924,29 +925,30 @@ rt, [this, notifyToken](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([this, notifyToken, promise]() { - std::string error; - try { - DatabaseManager::getQueryExecutor().setNotifyToken(notifyToken); - } catch (std::system_error &e) { - error = e.what(); - } + GlobalDBSingleton::instance.scheduleOrRun( + [this, notifyToken, promise]() { + std::string error; + try { + DatabaseManager::getQueryExecutor().setNotifyToken(notifyToken); + } catch (std::system_error &e) { + error = e.what(); + } - this->jsInvoker_->invokeAsync([error, promise]() { - if (error.size()) { - promise->reject(error); - } else { - promise->resolve(jsi::Value::undefined()); - } - }); - }); + this->jsInvoker_->invokeAsync([error, promise]() { + if (error.size()) { + promise->reject(error); + } else { + promise->resolve(jsi::Value::undefined()); + } + }); + }); }); } jsi::Value CommCoreModule::clearNotifyToken(jsi::Runtime &rt) { return createPromiseAsJSIValue( rt, [this](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([this, promise]() { + GlobalDBSingleton::instance.scheduleOrRun([this, promise]() { std::string error; try { DatabaseManager::getQueryExecutor().clearNotifyToken(); @@ -971,7 +973,9 @@ rt, [this, currentUserID](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([this, promise, currentUserID]() { + GlobalDBSingleton::instance.scheduleOrRun([this, + promise, + currentUserID]() { std::string error; try { DatabaseManager::getQueryExecutor().setCurrentUserID(currentUserID); @@ -992,7 +996,7 @@ jsi::Value CommCoreModule::getCurrentUserID(jsi::Runtime &rt) { return createPromiseAsJSIValue( rt, [this](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([this, &innerRt, promise]() { + GlobalDBSingleton::instance.scheduleOrRun([this, &innerRt, promise]() { std::string error; std::string result; try { @@ -1014,7 +1018,7 @@ jsi::Value CommCoreModule::clearSensitiveData(jsi::Runtime &rt) { return createPromiseAsJSIValue( rt, [this](jsi::Runtime &innerRt, std::shared_ptr promise) { - this->databaseThread->scheduleTask([this, promise]() { + GlobalDBSingleton::instance.scheduleOrRun([this, promise]() { std::string error; try { DatabaseManager::getQueryExecutor().clearSensitiveData();