diff --git a/lib/types/sqlite-types.js b/lib/types/sqlite-types.js --- a/lib/types/sqlite-types.js +++ b/lib/types/sqlite-types.js @@ -2,7 +2,7 @@ import type { IdentityAuthResult } from './identity-service-types.js'; import type { ClientDBMessageInfo } from './message-types.js'; -import type { StoreOperations } from './store-ops-types.js'; +import type { ClientStore, StoreOperations } from './store-ops-types.js'; import type { QRAuthBackupData } from './tunnelbroker/qr-code-auth-message-types.js'; import type { ClientDBDMOperation } from '../ops/dm-operations-store-ops.js'; @@ -69,6 +69,7 @@ +fetchDMOperationsByType: ( type: string, ) => Promise>, + +getClientDBStore: (currentUserID: ?string) => Promise, // write operations +removeInboundP2PMessages: (ids: $ReadOnlyArray) => Promise, diff --git a/lib/utils/__mocks__/config.js b/lib/utils/__mocks__/config.js --- a/lib/utils/__mocks__/config.js +++ b/lib/utils/__mocks__/config.js @@ -48,6 +48,7 @@ fetchMessages: jest.fn(), fetchDMOperationsByType: jest.fn(), restoreUserData: jest.fn(), + getClientDBStore: jest.fn(), }, encryptedNotifUtilsAPI: { generateAESKey: jest.fn(), 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 @@ -8,16 +8,6 @@ import type { CallSingleKeyserverEndpoint } from 'lib/keyserver-conn/call-single-keyserver-endpoint.js'; import type { CallKeyserverEndpoint } from 'lib/keyserver-conn/keyserver-conn-types.js'; 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'; -import { syncedMetadataStoreOpsHandlers } from 'lib/ops/synced-metadata-store-ops.js'; -import { threadActivityStoreOpsHandlers } from 'lib/ops/thread-activity-store-ops.js'; -import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js'; -import { userStoreOpsHandlers } from 'lib/ops/user-store-ops.js'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; import { useInitialNotificationsEncryptedMessage } from 'lib/shared/crypto-utils.js'; import { shouldClearData } from 'lib/shared/data-utils.js'; @@ -25,8 +15,8 @@ recoveryFromDataHandlerActionSources, type RecoveryFromDataHandlerActionSource, } from 'lib/types/account-types.js'; +import { getConfig } from 'lib/utils/config.js'; import { getMessageForException } from 'lib/utils/errors.js'; -import { translateClientDBLocalMessageInfos } from 'lib/utils/message-ops-utils.js'; import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; import { supportingMultipleKeyservers } from 'lib/utils/services-utils.js'; @@ -231,67 +221,13 @@ mediaCacheContext?.evictCache(), ]); try { - const { - threads, - messages, - drafts, - messageStoreThreads, - reports, - users, - keyservers, - communities, - integrityThreadHashes, - syncedMetadata, - auxUserInfos, - threadActivityEntries, - entries, - messageStoreLocalMessageInfos, - } = await commCoreModule.getClientDBStore(); - const threadInfosFromDB = - threadStoreOpsHandlers.translateClientDBData(threads); - const reportsFromDB = - reportStoreOpsHandlers.translateClientDBData(reports); - const usersFromDB = userStoreOpsHandlers.translateClientDBData(users); - const keyserverInfosFromDB = - keyserverStoreOpsHandlers.translateClientDBData(keyservers); - const communityInfosFromDB = - communityStoreOpsHandlers.translateClientDBData(communities); - const threadHashesFromDB = - integrityStoreOpsHandlers.translateClientDBData( - integrityThreadHashes, - ); - const syncedMetadataFromDB = - syncedMetadataStoreOpsHandlers.translateClientDBData(syncedMetadata); - const auxUserInfosFromDB = - auxUserStoreOpsHandlers.translateClientDBData(auxUserInfos); - const threadActivityStoreFromDB = - threadActivityStoreOpsHandlers.translateClientDBData( - threadActivityEntries, - ); - const entriesFromDB = - entryStoreOpsHandlers.translateClientDBData(entries); - const localMessageInfosFromDB = translateClientDBLocalMessageInfos( - messageStoreLocalMessageInfos, + const { sqliteAPI } = getConfig(); + const clientDBStore = await sqliteAPI.getClientDBStore( + currentLoggedInUserID, ); dispatch({ type: setClientDBStoreActionType, - payload: { - drafts, - messages, - threadStore: { threadInfos: threadInfosFromDB }, - currentUserID: currentLoggedInUserID, - messageStoreThreads, - reports: reportsFromDB, - users: usersFromDB, - keyserverInfos: keyserverInfosFromDB, - communities: communityInfosFromDB, - threadHashes: threadHashesFromDB, - syncedMetadata: syncedMetadataFromDB, - auxUserInfos: auxUserInfosFromDB, - threadActivityStore: threadActivityStoreFromDB, - entries: entriesFromDB, - messageStoreLocalMessageInfos: localMessageInfosFromDB, - }, + payload: clientDBStore, }); } catch (setStoreException) { if (isTaskCancelledError(setStoreException)) { diff --git a/native/database/sqlite-api.js b/native/database/sqlite-api.js --- a/native/database/sqlite-api.js +++ b/native/database/sqlite-api.js @@ -7,6 +7,7 @@ import type { QRAuthBackupData } from 'lib/types/tunnelbroker/qr-code-auth-message-types.js'; import { values } from 'lib/utils/objects.js'; +import { getClientDBStore } from './store.js'; import { commCoreModule } from '../native-modules.js'; import { storeVersion } from '../redux/persist-constants.js'; import { isTaskCancelledError } from '../utils/error-handling.js'; @@ -21,6 +22,7 @@ searchMessages: commCoreModule.searchMessages, fetchMessages: commCoreModule.fetchMessages, fetchDMOperationsByType: commCoreModule.getDMOperationsByType, + getClientDBStore, // write operations removeInboundP2PMessages: commCoreModule.removeInboundP2PMessages, diff --git a/native/database/store.js b/native/database/store.js new file mode 100644 --- /dev/null +++ b/native/database/store.js @@ -0,0 +1,76 @@ +// @flow + +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'; +import { syncedMetadataStoreOpsHandlers } from 'lib/ops/synced-metadata-store-ops.js'; +import { threadActivityStoreOpsHandlers } from 'lib/ops/thread-activity-store-ops.js'; +import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js'; +import { userStoreOpsHandlers } from 'lib/ops/user-store-ops.js'; +import type { ClientStore } from 'lib/types/store-ops-types.js'; +import { translateClientDBLocalMessageInfos } from 'lib/utils/message-ops-utils.js'; + +import { commCoreModule } from '../native-modules.js'; + +async function getClientDBStore(currentUserID: ?string): Promise { + const { + threads, + messages, + drafts, + messageStoreThreads, + reports, + users, + keyservers, + communities, + integrityThreadHashes, + syncedMetadata, + auxUserInfos, + threadActivityEntries, + entries, + messageStoreLocalMessageInfos, + } = await commCoreModule.getClientDBStore(); + const threadInfosFromDB = + threadStoreOpsHandlers.translateClientDBData(threads); + const reportsFromDB = reportStoreOpsHandlers.translateClientDBData(reports); + const usersFromDB = userStoreOpsHandlers.translateClientDBData(users); + const keyserverInfosFromDB = + keyserverStoreOpsHandlers.translateClientDBData(keyservers); + const communityInfosFromDB = + communityStoreOpsHandlers.translateClientDBData(communities); + const threadHashesFromDB = integrityStoreOpsHandlers.translateClientDBData( + integrityThreadHashes, + ); + const syncedMetadataFromDB = + syncedMetadataStoreOpsHandlers.translateClientDBData(syncedMetadata); + const auxUserInfosFromDB = + auxUserStoreOpsHandlers.translateClientDBData(auxUserInfos); + const threadActivityStoreFromDB = + threadActivityStoreOpsHandlers.translateClientDBData(threadActivityEntries); + const entriesFromDB = entryStoreOpsHandlers.translateClientDBData(entries); + const localMessageInfosFromDB = translateClientDBLocalMessageInfos( + messageStoreLocalMessageInfos, + ); + + return { + drafts, + messages, + threadStore: { threadInfos: threadInfosFromDB }, + currentUserID, + messageStoreThreads, + reports: reportsFromDB, + users: usersFromDB, + keyserverInfos: keyserverInfosFromDB, + communityInfos: communityInfosFromDB, + threadHashes: threadHashesFromDB, + syncedMetadata: syncedMetadataFromDB, + auxUserInfos: auxUserInfosFromDB, + threadActivityStore: threadActivityStoreFromDB, + entries: entriesFromDB, + messageStoreLocalMessageInfos: localMessageInfosFromDB, + }; +} + +export { getClientDBStore }; diff --git a/web/database/sqlite-api.js b/web/database/sqlite-api.js --- a/web/database/sqlite-api.js +++ b/web/database/sqlite-api.js @@ -14,6 +14,7 @@ import { getContentSigningKey } from 'lib/utils/crypto-utils.js'; import { entries, values } from 'lib/utils/objects.js'; +import { getClientDBStore } from './store.js'; import { getCommSharedWorker } from '../shared-worker/shared-worker-provider.js'; import { workerRequestMessageTypes } from '../types/worker-types.js'; @@ -129,6 +130,8 @@ return operations ? [...operations] : []; }, + getClientDBStore, + // write operations async removeInboundP2PMessages(ids: $ReadOnlyArray): Promise { const sharedWorker = await getCommSharedWorker(); diff --git a/web/shared-worker/utils/store.js b/web/database/store.js rename from web/shared-worker/utils/store.js rename to web/database/store.js --- a/web/shared-worker/utils/store.js +++ b/web/database/store.js @@ -13,14 +13,14 @@ import type { ClientStore } from 'lib/types/store-ops-types.js'; import { translateClientDBLocalMessageInfos } from 'lib/utils/message-ops-utils.js'; -import { defaultWebState } from '../../redux/default-state.js'; -import { workerRequestMessageTypes } from '../../types/worker-types.js'; -import { getCommSharedWorker } from '../shared-worker-provider.js'; +import { defaultWebState } from '../redux/default-state.js'; +import { getCommSharedWorker } from '../shared-worker/shared-worker-provider.js'; +import { workerRequestMessageTypes } from '../types/worker-types.js'; -async function getClientDBStore(): Promise { +async function getClientDBStore(currentUserID: ?string): Promise { const sharedWorker = await getCommSharedWorker(); let result: ClientStore = { - currentUserID: null, + currentUserID, drafts: [], messages: null, threadStore: null, diff --git a/web/redux/initial-state-gate.js b/web/redux/initial-state-gate.js --- a/web/redux/initial-state-gate.js +++ b/web/redux/initial-state-gate.js @@ -26,7 +26,6 @@ import { useSelector } from './redux-utils.js'; import { authoritativeKeyserverID } from '../authoritative-keyserver.js'; import Loading from '../loading.react.js'; -import { getClientDBStore } from '../shared-worker/utils/store.js'; import type { InitialReduxStateActionPayload } from '../types/redux-types.js'; type Props = { @@ -69,7 +68,9 @@ ), }; } - const clientDBStore = await getClientDBStore(); + + const { sqliteAPI } = getConfig(); + const clientDBStore = await sqliteAPI.getClientDBStore(null); dispatch({ type: setClientDBStoreActionType, payload: clientDBStore, @@ -171,7 +172,6 @@ const messageSearchStoreOperations = getMessageSearchStoreOps( messageStoreOperations, ); - const { sqliteAPI } = getConfig(); await sqliteAPI.processDBStoreOperations({ threadStoreOperations, draftStoreOperations: [],