diff --git a/lib/message-search-types.js b/lib/message-search-types.js new file mode 100644 --- /dev/null +++ b/lib/message-search-types.js @@ -0,0 +1,13 @@ +// @flow + +type UpdateSearchMessageOperation = { + +type: 'update_search_messages', + +payload: { + +originalMessageID: string, + +messageID: string, + +content: string, + }, +}; + +export type MessageSearchStoreOperation = UpdateSearchMessageOperation; +export type ClientDBMessageSearchStoreOperation = MessageSearchStoreOperation; 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 @@ -22,6 +22,7 @@ import type { ThreadActivityStore } from './thread-activity-types.js'; import type { ClientDBThreadInfo, ThreadStore } from './thread-types.js'; import type { UserInfos } from './user-types.js'; +import type { ClientDBMessageSearchStoreOperation } from '../message-search-types.js'; import type { ClientDBAuxUserInfo, ClientDBAuxUserStoreOperation, @@ -105,6 +106,7 @@ +threadActivityStoreOperations?: $ReadOnlyArray, +outboundP2PMessages?: $ReadOnlyArray, +entryStoreOperations?: $ReadOnlyArray, + +messageSearchStoreOperations?: $ReadOnlyArray, }; export type ClientDBStore = { 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 @@ -1,5 +1,6 @@ // @flow +import type { ClientDBMessageSearchStoreOperation } from 'lib/message-search-types.js'; 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'; @@ -376,6 +377,7 @@ threadActivityStoreOperations, outboundP2PMessages, entryStoreOperations, + messageSearchStoreOperations, } = storeOperations; try { @@ -473,6 +475,16 @@ module, ); } + if ( + messageSearchStoreOperations && + messageSearchStoreOperations.length > 0 + ) { + processMessageSearchStoreOperations( + sqliteQueryExecutor, + messageSearchStoreOperations, + module, + ); + } sqliteQueryExecutor.commitTransaction(); } catch (e) { sqliteQueryExecutor.rollbackTransaction(); @@ -577,6 +589,34 @@ } } +function processMessageSearchStoreOperations( + sqliteQueryExecutor: SQLiteQueryExecutor, + operations: $ReadOnlyArray, + module: EmscriptenModule, +) { + for (const operation: ClientDBMessageSearchStoreOperation of operations) { + try { + if (operation.type === 'update_search_messages') { + const { originalMessageID, messageID, content } = operation.payload; + sqliteQueryExecutor.updateMessageSearchIndex( + originalMessageID, + messageID, + content, + ); + } + } catch (e) { + throw new Error( + `Error while processing ${ + operation.type + } message search operation: ${getProcessingStoreOpsExceptionMessage( + e, + module, + )}`, + ); + } + } +} + function getClientStoreFromQueryExecutor( sqliteQueryExecutor: SQLiteQueryExecutor, ): ClientDBStore {