diff --git a/lib/types/store-ops-types.js b/lib/types/store-ops-types.js --- a/lib/types/store-ops-types.js +++ b/lib/types/store-ops-types.js @@ -14,6 +14,7 @@ ClientDBThreadMessageInfo, } from './message-types.js'; import type { ClientReportCreationRequest } from './report-types.js'; +import type { OutboundP2PMessage } from './sqlite-types.js'; import type { SyncedMetadata } from './synced-metadata-types.js'; import type { ThreadActivityStore } from './thread-activity-types.js'; import type { ClientDBThreadInfo, ThreadStore } from './thread-types.js'; @@ -78,6 +79,7 @@ +syncedMetadataStoreOperations?: $ReadOnlyArray, +auxUserStoreOperations?: $ReadOnlyArray, +threadActivityStoreOperations?: $ReadOnlyArray, + +outboundP2PMessages?: $ReadOnlyArray, }; export type ClientDBStoreOperations = { @@ -92,6 +94,7 @@ +syncedMetadataStoreOperations?: $ReadOnlyArray, +auxUserStoreOperations?: $ReadOnlyArray, +threadActivityStoreOperations?: $ReadOnlyArray, + +outboundP2PMessages?: $ReadOnlyArray, }; export type ClientDBStore = { diff --git a/native/cpp/CommonCpp/DatabaseManagers/entities/OutboundP2PMessage.h b/native/cpp/CommonCpp/DatabaseManagers/entities/OutboundP2PMessage.h --- a/native/cpp/CommonCpp/DatabaseManagers/entities/OutboundP2PMessage.h +++ b/native/cpp/CommonCpp/DatabaseManagers/entities/OutboundP2PMessage.h @@ -51,6 +51,23 @@ OutboundP2PMessage() = default; + OutboundP2PMessage( + const std::string &message_id, + const std::string &device_id, + const std::string &user_id, + const std::string ×tamp, + const std::string &plaintext, + const std::string &ciphertext, + const std::string &status) + : message_id(message_id), + device_id(device_id), + user_id(user_id), + timestamp(timestamp), + plaintext(plaintext), + ciphertext(ciphertext), + status(status) { + } + OutboundP2PMessage(const SQLiteOutboundP2PMessage &msg) { message_id = msg.message_id; device_id = msg.device_id; 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 @@ -427,6 +427,46 @@ createOperationsError = e.what(); } + std::vector messages; + try { + auto messagesJSIObj = operations.getProperty(rt, "outboundP2PMessages"); + + if (messagesJSIObj.isObject()) { + auto messagesJSI = messagesJSIObj.asObject(rt).asArray(rt); + for (size_t idx = 0; idx < messagesJSI.size(rt); idx++) { + jsi::Object msgObj = messagesJSI.getValueAtIndex(rt, idx).asObject(rt); + + std::string messageID = + msgObj.getProperty(rt, "messageID").asString(rt).utf8(rt); + std::string deviceID = + msgObj.getProperty(rt, "deviceID").asString(rt).utf8(rt); + std::string userID = + msgObj.getProperty(rt, "userID").asString(rt).utf8(rt); + std::string timestamp = + msgObj.getProperty(rt, "timestamp").asString(rt).utf8(rt); + std::string plaintext = + msgObj.getProperty(rt, "plaintext").asString(rt).utf8(rt); + std::string ciphertext = + msgObj.getProperty(rt, "ciphertext").asString(rt).utf8(rt); + std::string status = + msgObj.getProperty(rt, "status").asString(rt).utf8(rt); + + OutboundP2PMessage outboundMessage{ + messageID, + deviceID, + userID, + timestamp, + plaintext, + ciphertext, + status}; + messages.push_back(outboundMessage); + } + } + + } catch (std::runtime_error &e) { + createOperationsError = e.what(); + } + return facebook::react::createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, @@ -440,6 +480,10 @@ for (const auto &operation : *storeOpsPtr) { operation->execute(); } + if (messages.size() > 0) { + DatabaseManager::getQueryExecutor().addOutboundP2PMessages( + messages); + } DatabaseManager::getQueryExecutor().captureBackupLogs(); DatabaseManager::getQueryExecutor().commitTransaction(); } catch (std::system_error &e) { diff --git a/native/redux/redux-utils.js b/native/redux/redux-utils.js --- a/native/redux/redux-utils.js +++ b/native/redux/redux-utils.js @@ -44,6 +44,7 @@ syncedMetadataStoreOperations, auxUserStoreOperations, threadActivityStoreOperations, + outboundP2PMessages, } = storeOperations; const convertedThreadStoreOperations = @@ -95,6 +96,7 @@ syncedMetadataStoreOperations: convertedSyncedMetadataStoreOperations, auxUserStoreOperations: convertedAuxUserStoreOperations, threadActivityStoreOperations: convertedThreadActivityStoreOperations, + outboundP2PMessages, }; if (values(dbOps).some(ops => ops && ops.length > 0)) { promises.push(commCoreModule.processDBStoreOperations(dbOps)); diff --git a/web/shared-worker/utils/store.js b/web/shared-worker/utils/store.js --- a/web/shared-worker/utils/store.js +++ b/web/shared-worker/utils/store.js @@ -154,6 +154,7 @@ userStoreOperations, messageStoreOperations, threadActivityStoreOperations, + outboundP2PMessages, } = storeOperations; const canUseDatabase = canUseDatabaseOnWeb(userID); @@ -220,6 +221,7 @@ userStoreOperations: convertedUserStoreOperations, messageStoreOperations: convertedMessageStoreOperations, threadActivityStoreOperations: convertedThreadActivityStoreOperations, + outboundP2PMessages, }, }); } catch (e) { diff --git a/web/shared-worker/worker/process-operations.js b/web/shared-worker/worker/process-operations.js --- a/web/shared-worker/worker/process-operations.js +++ b/web/shared-worker/worker/process-operations.js @@ -362,6 +362,7 @@ userStoreOperations, messageStoreOperations, threadActivityStoreOperations, + outboundP2PMessages, } = storeOperations; try { @@ -449,6 +450,9 @@ module, ); } + if (outboundP2PMessages && outboundP2PMessages.length > 0) { + sqliteQueryExecutor.addOutboundP2PMessages(outboundP2PMessages); + } sqliteQueryExecutor.commitTransaction(); } catch (e) { sqliteQueryExecutor.rollbackTransaction();