diff --git a/native/backup/use-client-backup.js b/native/backup/use-client-backup.js --- a/native/backup/use-client-backup.js +++ b/native/backup/use-client-backup.js @@ -93,7 +93,12 @@ } const backupSecret = await getBackupSecret(); - return authVerifiedEndpoint(commCoreModule.createFullBackup(backupSecret)); + const callback = (backupID: string) => { + console.log('Compaction created. Starting upload. backupID:', backupID); + }; + return authVerifiedEndpoint( + commCoreModule.createFullBackup(backupSecret, callback), + ); }, [loggedIn, currentUserID, getBackupSecret, authVerifiedEndpoint]); const createUserKeysBackup = React.useCallback(async () => { 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 @@ -209,8 +209,10 @@ virtual void innerClearCommServicesAuthMetadata(); virtual void startBackupHandler(jsi::Runtime &rt) override; virtual void stopBackupHandler(jsi::Runtime &rt) override; - virtual jsi::Value - createFullBackup(jsi::Runtime &rt, jsi::String backupSecret) override; + virtual jsi::Value createFullBackup( + jsi::Runtime &rt, + jsi::String backupSecret, + jsi::Function compactionCreationCallback) override; virtual jsi::Value createUserKeysBackup(jsi::Runtime &rt, jsi::String backupSecret) override; virtual jsi::Value restoreBackupData( 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 @@ -2383,9 +2383,23 @@ return backupSIWEMessageFuture.get(); } -jsi::Value -CommCoreModule::createFullBackup(jsi::Runtime &rt, jsi::String backupSecret) { +jsi::Value CommCoreModule::createFullBackup( + jsi::Runtime &rt, + jsi::String backupSecret, + jsi::Function compactionCreationCallback) { std::string backupSecretStr = backupSecret.utf8(rt); + + auto dummyReject = jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "_reject"), + 0, + [](jsi::Runtime &rt, + const jsi::Value &thisVal, + const jsi::Value *args, + size_t count) { return jsi::Value::undefined(); }); + auto compactionCreationPromise = std::make_shared( + rt, std::move(compactionCreationCallback), std::move(dummyReject)); + return createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { std::string backupMessage; @@ -2419,6 +2433,9 @@ } if (!error.size()) { + + auto compactionCreationID = RustPromiseManager::instance.addPromise( + {compactionCreationPromise, this->jsInvoker_, innerRt}); auto currentID = RustPromiseManager::instance.addPromise( {promise, this->jsInvoker_, innerRt}); ::createBackup( @@ -2427,6 +2444,7 @@ rust::string(pickleKey), rust::string(pickledAccount), rust::string(backupMessage), + compactionCreationID, currentID); } else { this->jsInvoker_->invokeAsync( 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 @@ -161,7 +161,7 @@ return static_cast(&turboModule)->createUserKeysBackup(rt, args[0].asString(rt)); } static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_createFullBackup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { - return static_cast(&turboModule)->createFullBackup(rt, args[0].asString(rt)); + return static_cast(&turboModule)->createFullBackup(rt, args[0].asString(rt), args[1].asObject(rt).asFunction(rt)); } static jsi::Value __hostFunction_CommCoreModuleSchemaCxxSpecJSI_restoreBackupData(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->restoreBackupData(rt, args[0].asString(rt), args[1].asString(rt), args[2].asString(rt), args[3].asString(rt)); @@ -288,7 +288,7 @@ methodMap_["startBackupHandler"] = MethodMetadata {0, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_startBackupHandler}; methodMap_["stopBackupHandler"] = MethodMetadata {0, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_stopBackupHandler}; methodMap_["createUserKeysBackup"] = MethodMetadata {1, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_createUserKeysBackup}; - methodMap_["createFullBackup"] = MethodMetadata {1, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_createFullBackup}; + methodMap_["createFullBackup"] = MethodMetadata {2, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_createFullBackup}; methodMap_["restoreBackupData"] = MethodMetadata {4, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_restoreBackupData}; methodMap_["getQRAuthBackupData"] = MethodMetadata {0, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_getQRAuthBackupData}; methodMap_["retrieveLatestBackupInfo"] = MethodMetadata {1, __hostFunction_CommCoreModuleSchemaCxxSpecJSI_retrieveLatestBackupInfo}; 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 @@ -67,7 +67,7 @@ virtual void startBackupHandler(jsi::Runtime &rt) = 0; virtual void stopBackupHandler(jsi::Runtime &rt) = 0; virtual jsi::Value createUserKeysBackup(jsi::Runtime &rt, jsi::String backupSecret) = 0; - virtual jsi::Value createFullBackup(jsi::Runtime &rt, jsi::String backupSecret) = 0; + virtual jsi::Value createFullBackup(jsi::Runtime &rt, jsi::String backupSecret, jsi::Function compactionCreationCallback) = 0; virtual jsi::Value restoreBackupData(jsi::Runtime &rt, jsi::String backupID, jsi::String backupDataKey, jsi::String backupLogDataKey, jsi::String maxVersion) = 0; virtual jsi::Value getQRAuthBackupData(jsi::Runtime &rt) = 0; virtual jsi::Value retrieveLatestBackupInfo(jsi::Runtime &rt, jsi::String userIdentifier) = 0; @@ -490,13 +490,13 @@ return bridging::callFromJs( rt, &T::createUserKeysBackup, jsInvoker_, instance_, std::move(backupSecret)); } - jsi::Value createFullBackup(jsi::Runtime &rt, jsi::String backupSecret) override { + jsi::Value createFullBackup(jsi::Runtime &rt, jsi::String backupSecret, jsi::Function compactionCreationCallback) override { static_assert( - bridging::getParameterCount(&T::createFullBackup) == 2, - "Expected createFullBackup(...) to have 2 parameters"); + bridging::getParameterCount(&T::createFullBackup) == 3, + "Expected createFullBackup(...) to have 3 parameters"); return bridging::callFromJs( - rt, &T::createFullBackup, jsInvoker_, instance_, std::move(backupSecret)); + rt, &T::createFullBackup, jsInvoker_, instance_, std::move(backupSecret), std::move(compactionCreationCallback)); } jsi::Value restoreBackupData(jsi::Runtime &rt, jsi::String backupID, jsi::String backupDataKey, jsi::String backupLogDataKey, jsi::String maxVersion) override { static_assert( diff --git a/native/native_rust_library/src/backup.rs b/native/native_rust_library/src/backup.rs --- a/native/native_rust_library/src/backup.rs +++ b/native/native_rust_library/src/backup.rs @@ -37,6 +37,8 @@ } pub mod ffi { + use std::convert::Infallible; + use super::*; pub use upload_handler::ffi::*; @@ -95,9 +97,10 @@ pickle_key: String, pickled_account: String, siwe_backup_msg: String, - promise_id: u32, + compaction_promise_id: u32, + upload_promise_id: u32, ) { - compaction_upload_promises::insert(backup_id.clone(), promise_id); + compaction_upload_promises::insert(backup_id.clone(), upload_promise_id); RUNTIME.spawn(async move { let Ok((backup_data_key, backup_log_data_key)) = @@ -120,10 +123,20 @@ &backup_log_data_key )); if let Err(err) = future.await { + handle_string_result_as_callback( + Err::(err.to_string()), + compaction_promise_id, + ); handle_backup_creation_error(backup_id.clone(), err.to_string()); return; } + // resolve compaction creation promise + handle_string_result_as_callback( + Ok::<_, Infallible>(backup_id), + compaction_promise_id, + ); + trigger_backup_file_upload(); // The promise will be resolved when the backup is uploaded }); diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs --- a/native/native_rust_library/src/lib.rs +++ b/native/native_rust_library/src/lib.rs @@ -439,7 +439,8 @@ pickle_key: String, pickled_account: String, siwe_backup_msg: String, - promise_id: u32, + compaction_promise_id: u32, + upload_promise_id: u32, ); #[cxx_name = "createUserKeysBackup"] diff --git a/native/schema/CommCoreModuleSchema.js b/native/schema/CommCoreModuleSchema.js --- a/native/schema/CommCoreModuleSchema.js +++ b/native/schema/CommCoreModuleSchema.js @@ -159,7 +159,10 @@ +startBackupHandler: () => void; +stopBackupHandler: () => void; +createUserKeysBackup: (backupSecret: string) => Promise; - +createFullBackup: (backupSecret: string) => Promise; + +createFullBackup: ( + backupSecret: string, + compactionCreationCallback: (backupID: string) => void, + ) => Promise; +restoreBackupData: ( backupID: string, backupDataKey: string,