diff --git a/lib/reducers/message-reducer.test.js b/lib/reducers/message-reducer.test.js --- a/lib/reducers/message-reducer.test.js +++ b/lib/reducers/message-reducer.test.js @@ -297,6 +297,7 @@ syncedMetadata: {}, auxUserInfos: {}, threadActivityStore: {}, + entries: {}, }, }, { 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 @@ -7,6 +7,7 @@ ClientDBDraftStoreOperation, ClientDBDraftInfo, } from './draft-types.js'; +import type { RawEntryInfos } from './entry-types.js'; import type { ThreadHashes } from './integrity-types.js'; import type { KeyserverInfos } from './keyserver-types.js'; import type { @@ -28,6 +29,11 @@ ClientDBCommunityStoreOperation, CommunityStoreOperation, } from '../ops/community-store-ops.js'; +import type { + ClientDBEntryInfo, + EntryStoreOperation, + ClientDBEntryStoreOperation, +} from '../ops/entries-store-ops.js'; import type { ClientDBIntegrityThreadHash, ClientDBIntegrityStoreOperation, @@ -78,6 +84,7 @@ +syncedMetadataStoreOperations?: $ReadOnlyArray, +auxUserStoreOperations?: $ReadOnlyArray, +threadActivityStoreOperations?: $ReadOnlyArray, + +entryStoreOperations?: $ReadOnlyArray, }; export type ClientDBStoreOperations = { @@ -92,6 +99,7 @@ +syncedMetadataStoreOperations?: $ReadOnlyArray, +auxUserStoreOperations?: $ReadOnlyArray, +threadActivityStoreOperations?: $ReadOnlyArray, + +entryStoreOperations?: $ReadOnlyArray, }; export type ClientDBStore = { @@ -107,6 +115,7 @@ +syncedMetadata: $ReadOnlyArray, +auxUserInfos: $ReadOnlyArray, +threadActivityEntries: $ReadOnlyArray, + +entries: $ReadOnlyArray, }; export type ClientStore = { @@ -123,4 +132,5 @@ +syncedMetadata: ?SyncedMetadata, +auxUserInfos: ?AuxUserInfos, +threadActivityStore: ?ThreadActivityStore, + +entries: ?RawEntryInfos, }; diff --git a/native/data/sqlite-data-handler.js b/native/data/sqlite-data-handler.js --- a/native/data/sqlite-data-handler.js +++ b/native/data/sqlite-data-handler.js @@ -10,6 +10,7 @@ import { useKeyserverRecoveryLogIn } from 'lib/keyserver-conn/recovery-utils.js'; import { auxUserStoreOpsHandlers } from 'lib/ops/aux-user-store-ops.js'; import { communityStoreOpsHandlers } from 'lib/ops/community-store-ops.js'; +import { entryStoreOpsHandlers } from 'lib/ops/entries-store-ops.js'; import { integrityStoreOpsHandlers } from 'lib/ops/integrity-store-ops.js'; import { keyserverStoreOpsHandlers } from 'lib/ops/keyserver-store-ops.js'; import { reportStoreOpsHandlers } from 'lib/ops/report-store-ops.js'; @@ -242,6 +243,7 @@ syncedMetadata, auxUserInfos, threadActivityEntries, + entries, } = await commCoreModule.getClientDBStore(); const threadInfosFromDB = threadStoreOpsHandlers.translateClientDBData(threads); @@ -264,6 +266,8 @@ threadActivityStoreOpsHandlers.translateClientDBData( threadActivityEntries, ); + const entriesFromDB = + entryStoreOpsHandlers.translateClientDBData(entries); dispatch({ type: setClientDBStoreActionType, payload: { @@ -280,6 +284,7 @@ syncedMetadata: syncedMetadataFromDB, auxUserInfos: auxUserInfosFromDB, threadActivityStore: threadActivityStoreFromDB, + entries: entriesFromDB, }, }); } catch (setStoreException) { 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 @@ -4,6 +4,7 @@ import { auxUserStoreOpsHandlers } from 'lib/ops/aux-user-store-ops.js'; import { communityStoreOpsHandlers } from 'lib/ops/community-store-ops.js'; +import { entryStoreOpsHandlers } from 'lib/ops/entries-store-ops.js'; import { integrityStoreOpsHandlers } from 'lib/ops/integrity-store-ops.js'; import { keyserverStoreOpsHandlers, @@ -44,6 +45,7 @@ syncedMetadataStoreOperations, auxUserStoreOperations, threadActivityStoreOperations, + entryStoreOperations, } = storeOperations; const convertedThreadStoreOperations = @@ -72,6 +74,8 @@ threadActivityStoreOpsHandlers.convertOpsToClientDBOps( threadActivityStoreOperations, ); + const convertedEntryStoreOperations = + entryStoreOpsHandlers.convertOpsToClientDBOps(entryStoreOperations); try { const promises = []; @@ -95,6 +99,7 @@ syncedMetadataStoreOperations: convertedSyncedMetadataStoreOperations, auxUserStoreOperations: convertedAuxUserStoreOperations, threadActivityStoreOperations: convertedThreadActivityStoreOperations, + entryStoreOperations: convertedEntryStoreOperations, }; 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 @@ -2,6 +2,7 @@ import { auxUserStoreOpsHandlers } from 'lib/ops/aux-user-store-ops.js'; import { communityStoreOpsHandlers } from 'lib/ops/community-store-ops.js'; +import { entryStoreOpsHandlers } from 'lib/ops/entries-store-ops.js'; import { integrityStoreOpsHandlers } from 'lib/ops/integrity-store-ops.js'; import { keyserverStoreOpsHandlers } from 'lib/ops/keyserver-store-ops.js'; import { messageStoreOpsHandlers } from 'lib/ops/message-store-ops.js'; @@ -37,6 +38,7 @@ syncedMetadata: null, auxUserInfos: null, threadActivityStore: null, + entries: null, }; const data = await sharedWorker.schedule({ type: workerRequestMessageTypes.GET_CLIENT_STORE, @@ -135,6 +137,13 @@ ), }; } + + if (data?.store?.entries && data.store.entries.length > 0) { + result = { + ...result, + entries: entryStoreOpsHandlers.translateClientDBData(data.store.entries), + }; + } return result; } @@ -154,6 +163,7 @@ userStoreOperations, messageStoreOperations, threadActivityStoreOperations, + entryStoreOperations, } = storeOperations; const canUseDatabase = canUseDatabaseOnWeb(userID); @@ -183,6 +193,8 @@ threadActivityStoreOpsHandlers.convertOpsToClientDBOps( threadActivityStoreOperations, ); + const convertedEntryStoreOperations = + entryStoreOpsHandlers.convertOpsToClientDBOps(entryStoreOperations); if ( convertedThreadStoreOperations.length === 0 && @@ -195,7 +207,8 @@ convertedAuxUserStoreOperations.length === 0 && convertedUserStoreOperations.length === 0 && convertedMessageStoreOperations.length === 0 && - convertedThreadActivityStoreOperations.length === 0 + convertedThreadActivityStoreOperations.length === 0 && + convertedEntryStoreOperations.length === 0 ) { return; } @@ -220,6 +233,7 @@ userStoreOperations: convertedUserStoreOperations, messageStoreOperations: convertedMessageStoreOperations, threadActivityStoreOperations: convertedThreadActivityStoreOperations, + entryStoreOperations: convertedEntryStoreOperations, }, }); } 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 @@ -2,6 +2,7 @@ import type { ClientDBAuxUserStoreOperation } from 'lib/ops/aux-user-store-ops.js'; import type { ClientDBCommunityStoreOperation } from 'lib/ops/community-store-ops.js'; +import type { ClientDBEntryStoreOperation } from 'lib/ops/entries-store-ops.js'; import type { ClientDBIntegrityStoreOperation } from 'lib/ops/integrity-store-ops.js'; import type { ClientDBKeyserverStoreOperation } from 'lib/ops/keyserver-store-ops.js'; import type { ClientDBMessageStoreOperation } from 'lib/ops/message-store-ops.js'; @@ -362,6 +363,7 @@ userStoreOperations, messageStoreOperations, threadActivityStoreOperations, + entryStoreOperations, } = storeOperations; try { @@ -449,6 +451,13 @@ module, ); } + if (entryStoreOperations && entryStoreOperations.length > 0) { + processEntryStoreOperations( + sqliteQueryExecutor, + entryStoreOperations, + module, + ); + } sqliteQueryExecutor.commitTransaction(); } catch (e) { sqliteQueryExecutor.rollbackTransaction(); @@ -522,6 +531,37 @@ } } +function processEntryStoreOperations( + sqliteQueryExecutor: SQLiteQueryExecutor, + operations: $ReadOnlyArray, + module: EmscriptenModule, +) { + for (const operation: ClientDBEntryStoreOperation of operations) { + try { + if (operation.type === 'remove_all_entries') { + sqliteQueryExecutor.removeAllEntries(); + } else if (operation.type === 'remove_entries') { + const { ids } = operation.payload; + sqliteQueryExecutor.removeEntries(ids); + } else if (operation.type === 'replace_entry') { + const { id, entry } = operation.payload; + sqliteQueryExecutor.replaceEntry({ id, entry }); + } else { + throw new Error('Unsupported thread activity operation'); + } + } catch (e) { + throw new Error( + `Error while processing &{ + operation.type + } entry store operation: ${getProcessingStoreOpsExceptionMessage( + e, + module, + )}`, + ); + } + } +} + function getClientStoreFromQueryExecutor( sqliteQueryExecutor: SQLiteQueryExecutor, ): ClientDBStore { @@ -547,6 +587,7 @@ syncedMetadata: sqliteQueryExecutor.getAllSyncedMetadata(), auxUserInfos: sqliteQueryExecutor.getAllAuxUserInfos(), threadActivityEntries: sqliteQueryExecutor.getAllThreadActivityEntries(), + entries: sqliteQueryExecutor.getAllEntries(), }; }