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 @@ -39,7 +39,10 @@ ClientDBReport, ClientDBReportStoreOperation, } from '../ops/report-store-ops.js'; -import type { ClientDBSyncedMetadataEntry } from '../ops/synced-metadata-store-ops.js'; +import type { + ClientDBSyncedMetadataEntry, + ClientDBSyncedMetadataStoreOperation, +} from '../ops/synced-metadata-store-ops.js'; import type { ClientDBThreadStoreOperation, ThreadStoreOperation, @@ -68,6 +71,7 @@ +keyserverStoreOperations?: $ReadOnlyArray, +communityStoreOperations?: $ReadOnlyArray, +integrityStoreOperations?: $ReadOnlyArray, + +syncedMetadataStoreOperations?: $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 @@ -4,6 +4,7 @@ import type { ClientDBIntegrityStoreOperation } from 'lib/ops/integrity-store-ops.js'; import type { ClientDBKeyserverStoreOperation } from 'lib/ops/keyserver-store-ops.js'; import type { ClientDBReportStoreOperation } from 'lib/ops/report-store-ops.js'; +import type { ClientDBSyncedMetadataStoreOperation } from 'lib/ops/synced-metadata-store-ops.js'; import type { ClientDBThreadStoreOperation } from 'lib/ops/thread-store-ops.js'; import type { ClientDBDraftStoreOperation, @@ -218,6 +219,37 @@ } } +function processSyncedMetadataStoreOperations( + sqliteQueryExecutor: SQLiteQueryExecutor, + operations: $ReadOnlyArray, + module: EmscriptenModule, +) { + for (const operation: ClientDBSyncedMetadataStoreOperation of operations) { + try { + if (operation.type === 'remove_all_synced_metadata') { + sqliteQueryExecutor.removeAllSyncedMetadata(); + } else if (operation.type === 'remove_synced_metadata') { + const { names } = operation.payload; + sqliteQueryExecutor.removeSyncedMetadata(names); + } else if (operation.type === 'replace_synced_metadata_entry') { + const { name, data } = operation.payload; + sqliteQueryExecutor.replaceSyncedMetadataEntry({ name, data }); + } else { + throw new Error('Unsupported synced metadata operation'); + } + } catch (e) { + throw new Error( + `Error while processing ${ + operation.type + } synced metadata operation: ${getProcessingStoreOpsExceptionMessage( + e, + module, + )}`, + ); + } + } +} + function processDBStoreOperations( sqliteQueryExecutor: SQLiteQueryExecutor, storeOperations: ClientDBStoreOperations, @@ -230,6 +262,7 @@ keyserverStoreOperations, communityStoreOperations, integrityStoreOperations, + syncedMetadataStoreOperations, } = storeOperations; try { @@ -276,6 +309,16 @@ module, ); } + if ( + syncedMetadataStoreOperations && + syncedMetadataStoreOperations.length > 0 + ) { + processSyncedMetadataStoreOperations( + sqliteQueryExecutor, + syncedMetadataStoreOperations, + module, + ); + } sqliteQueryExecutor.commitTransaction(); } catch (e) { sqliteQueryExecutor.rollbackTransaction(); @@ -299,7 +342,7 @@ keyservers: sqliteQueryExecutor.getAllKeyservers(), communities: sqliteQueryExecutor.getAllCommunities(), integrityThreadHashes: sqliteQueryExecutor.getAllIntegrityThreadHashes(), - syncedMetadata: [], + syncedMetadata: sqliteQueryExecutor.getAllSyncedMetadata(), }; }