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 @@ -24,6 +24,7 @@ CommSecureStore secureStore; const std::string secureStoreAccountDataKey = "cryptoAccountDataKey"; const std::string publicCryptoAccountID = "publicCryptoAccountID"; + const std::string commServicesAccessToken = "commServicesAccessToken"; std::unique_ptr cryptoModule; DraftStore draftStore; ThreadStore threadStore; @@ -95,6 +96,11 @@ jsi::String backupID) override; virtual jsi::Value generateRandomString(jsi::Runtime &rt, double size) override; + virtual jsi::Value setCommServicesAccessToken( + jsi::Runtime &rt, + jsi::String accessToken) override; + virtual jsi::Value getCommServicesAccessToken(jsi::Runtime &rt) override; + virtual jsi::Value clearCommServicesAccessToken(jsi::Runtime &rt) override; public: CommCoreModule(std::shared_ptr jsInvoker); 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 @@ -957,4 +957,91 @@ }); } +jsi::Value CommCoreModule::setCommServicesAccessToken( + jsi::Runtime &rt, + jsi::String accessToken) { + auto accessTokenStr{accessToken.utf8(rt)}; + return createPromiseAsJSIValue( + rt, + [this, accessTokenStr]( + jsi::Runtime &innerRt, std::shared_ptr promise) { + taskType job = [this, promise, accessTokenStr]() { + std::string error; + try { + this->secureStore.set( + this->commServicesAccessToken, accessTokenStr); + } catch (const std::exception &e) { + error = e.what(); + } + this->jsInvoker_->invokeAsync([error, promise]() { + if (error.size()) { + promise->reject(error); + } else { + promise->resolve(jsi::Value::undefined()); + } + }); + }; + GlobalDBSingleton::instance.scheduleOrRunCancellable( + job, promise, this->jsInvoker_); + }); +} + +jsi::Value CommCoreModule::getCommServicesAccessToken(jsi::Runtime &rt) { + return createPromiseAsJSIValue( + rt, [this](jsi::Runtime &innerRt, std::shared_ptr promise) { + taskType job = [this, &innerRt, promise]() { + std::string error; + std::string accessToken; + try { + folly::Optional accessTokenOpt = + this->secureStore.get(this->commServicesAccessToken); + if (!accessTokenOpt.hasValue()) { + error = "Comm services access token not found"; + } else { + accessToken = accessTokenOpt.value(); + if (accessToken.empty()) { + error = "Comm services access token not set"; + } + } + } catch (const std::exception &e) { + error = e.what(); + } + this->jsInvoker_->invokeAsync( + [&innerRt, error, accessToken, promise]() { + if (error.size()) { + promise->reject(error); + } else { + promise->resolve( + jsi::String::createFromUtf8(innerRt, accessToken)); + } + }); + }; + GlobalDBSingleton::instance.scheduleOrRunCancellable( + job, promise, this->jsInvoker_); + }); +} + +jsi::Value CommCoreModule::clearCommServicesAccessToken(jsi::Runtime &rt) { + return createPromiseAsJSIValue( + rt, [this](jsi::Runtime &innerRt, std::shared_ptr promise) { + taskType job = [this, promise]() { + std::string error; + try { + this->secureStore.set(this->commServicesAccessToken, ""); + } catch (const std::exception &e) { + error = e.what(); + } + this->jsInvoker_->invokeAsync([error, promise]() { + if (error.size()) { + promise->reject(error); + } else { + promise->resolve(jsi::Value::undefined()); + } + }); + }; + GlobalDBSingleton::instance.scheduleOrRunCancellable( + job, promise, this->jsInvoker_); + }); +} + } // namespace comm diff --git a/native/cpp/CommonCpp/_generated/commJSI-generated.cpp b/native/cpp/CommonCpp/_generated/commJSI-generated.cpp --- a/native/cpp/CommonCpp/_generated/commJSI-generated.cpp +++ b/native/cpp/CommonCpp/_generated/commJSI-generated.cpp @@ -119,6 +119,15 @@ static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_generateRandomString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->generateRandomString(rt, args[0].asNumber()); } +static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_setCommServicesAccessToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setCommServicesAccessToken(rt, args[0].asString(rt)); +} +static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_getCommServicesAccessToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getCommServicesAccessToken(rt); +} +static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_clearCommServicesAccessToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->clearCommServicesAccessToken(rt); +} CommCoreModuleSchemaCxxSpecJSI::CommCoreModuleSchemaCxxSpecJSI(std::shared_ptr jsInvoker) : TurboModule("CommTurboModule", jsInvoker) { @@ -156,6 +165,9 @@ methodMap_["reportDBOperationsFailure"] = MethodMetadata {0, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_reportDBOperationsFailure}; methodMap_["computeBackupKey"] = MethodMetadata {2, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_computeBackupKey}; methodMap_["generateRandomString"] = MethodMetadata {1, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_generateRandomString}; + methodMap_["setCommServicesAccessToken"] = MethodMetadata {1, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_setCommServicesAccessToken}; + methodMap_["getCommServicesAccessToken"] = MethodMetadata {0, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_getCommServicesAccessToken}; + methodMap_["clearCommServicesAccessToken"] = MethodMetadata {0, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_clearCommServicesAccessToken}; } diff --git a/native/cpp/CommonCpp/_generated/commJSI.h b/native/cpp/CommonCpp/_generated/commJSI.h --- a/native/cpp/CommonCpp/_generated/commJSI.h +++ b/native/cpp/CommonCpp/_generated/commJSI.h @@ -54,6 +54,9 @@ virtual void reportDBOperationsFailure(jsi::Runtime &rt) = 0; virtual jsi::Value computeBackupKey(jsi::Runtime &rt, jsi::String password, jsi::String backupID) = 0; virtual jsi::Value generateRandomString(jsi::Runtime &rt, double size) = 0; + virtual jsi::Value setCommServicesAccessToken(jsi::Runtime &rt, jsi::String accessToken) = 0; + virtual jsi::Value getCommServicesAccessToken(jsi::Runtime &rt) = 0; + virtual jsi::Value clearCommServicesAccessToken(jsi::Runtime &rt) = 0; }; @@ -347,6 +350,30 @@ return bridging::callFromJs( rt, &T::generateRandomString, jsInvoker_, instance_, std::move(size)); } + jsi::Value setCommServicesAccessToken(jsi::Runtime &rt, jsi::String accessToken) override { + static_assert( + bridging::getParameterCount(&T::setCommServicesAccessToken) == 2, + "Expected setCommServicesAccessToken(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setCommServicesAccessToken, jsInvoker_, instance_, std::move(accessToken)); + } + jsi::Value getCommServicesAccessToken(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getCommServicesAccessToken) == 1, + "Expected getCommServicesAccessToken(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getCommServicesAccessToken, jsInvoker_, instance_); + } + jsi::Value clearCommServicesAccessToken(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::clearCommServicesAccessToken) == 1, + "Expected clearCommServicesAccessToken(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::clearCommServicesAccessToken, jsInvoker_, instance_); + } private: T *instance_; diff --git a/native/schema/CommCoreModuleSchema.js b/native/schema/CommCoreModuleSchema.js --- a/native/schema/CommCoreModuleSchema.js +++ b/native/schema/CommCoreModuleSchema.js @@ -92,6 +92,9 @@ +reportDBOperationsFailure: () => void; +computeBackupKey: (password: string, backupID: string) => Promise; +generateRandomString: (size: number) => Promise; + +setCommServicesAccessToken: (accessToken: string) => Promise; + +getCommServicesAccessToken: () => Promise; + +clearCommServicesAccessToken: () => Promise; } export interface CoreModuleSpec extends Spec {