diff --git a/keyserver/src/shared/state-sync/state-sync-spec.js b/keyserver/src/shared/state-sync/state-sync-spec.js --- a/keyserver/src/shared/state-sync/state-sync-spec.js +++ b/keyserver/src/shared/state-sync/state-sync-spec.js @@ -11,5 +11,5 @@ calendarQuery: $ReadOnlyArray, ids?: $ReadOnlySet, ) => Promise, - ...StateSyncSpec, + ...StateSyncSpec, }; diff --git a/lib/selectors/socket-selectors.js b/lib/selectors/socket-selectors.js --- a/lib/selectors/socket-selectors.js +++ b/lib/selectors/socket-selectors.js @@ -1,23 +1,18 @@ // @flow import { createSelector } from 'reselect'; -import t from 'tcomb'; import { updatesCurrentAsOfSelector, currentAsOfSelector, } from './keyserver-selectors.js'; import { currentCalendarQuery } from './nav-selectors.js'; -import { - serverEntryInfo, - serverEntryInfosObject, - filterRawEntryInfosByCalendarQuery, -} from '../shared/entry-utils.js'; +import { serverEntryInfo } from '../shared/entry-utils.js'; +import { stateSyncSpecs } from '../shared/state-sync/state-sync-specs.js'; import threadWatcher from '../shared/thread-watcher.js'; import type { SignedIdentityKeysBlob } from '../types/crypto-types.js'; import { type RawEntryInfos, - rawEntryInfoValidator, type CalendarQuery, } from '../types/entry-types.js'; import type { AppState } from '../types/redux-types.js'; @@ -29,21 +24,11 @@ } from '../types/request-types.js'; import type { SessionState } from '../types/session-types.js'; import type { OneTimeKeyGenerator } from '../types/socket-types.js'; -import { - type RawThreadInfos, - rawThreadInfoValidator, -} from '../types/thread-types.js'; -import { - type CurrentUserInfo, - currentUserInfoValidator, - type UserInfos, - userInfosValidator, -} from '../types/user-types.js'; +import { type RawThreadInfos } from '../types/thread-types.js'; +import { type CurrentUserInfo, type UserInfos } from '../types/user-types.js'; import { getConfig } from '../utils/config.js'; -import { convertClientIDsToServerIDs } from '../utils/conversion-utils.js'; import { minimumOneTimeKeysRequired } from '../utils/crypto-utils.js'; -import { values, hash } from '../utils/objects.js'; -import { tID, ashoatKeyserverID } from '../utils/validation-utils.js'; +import { hash } from '../utils/objects.js'; const queuedReports: ( state: AppState, @@ -101,34 +86,29 @@ platformDetails: getConfig().platformDetails, }); } else if (serverRequest.type === serverRequestTypes.CHECK_STATE) { - const filteredEntryInfos = filterRawEntryInfosByCalendarQuery( - serverEntryInfosObject(values(entryInfos)), - calendarQuery(calendarActive), - ); + const query = calendarQuery(calendarActive); - const convertedEntryInfos = convertClientIDsToServerIDs( - ashoatKeyserverID, - t.dict(tID, rawEntryInfoValidator), - filteredEntryInfos, - ); + const convertedEntryInfos = + stateSyncSpecs.entries.convertClientToServerInfos( + entryInfos, + query, + ); - const convertedThreadInfos = convertClientIDsToServerIDs( - ashoatKeyserverID, - t.dict(tID, rawThreadInfoValidator), - threadInfos, - ); + const convertedThreadInfos = + stateSyncSpecs.threads.convertClientToServerInfos( + threadInfos, + query, + ); - const convertedUserInfos = convertClientIDsToServerIDs( - ashoatKeyserverID, - userInfosValidator, - userInfos, - ); + const convertedUserInfos = + stateSyncSpecs.users.convertClientToServerInfos(userInfos, query); - const convertedCurrentUserInfo = convertClientIDsToServerIDs( - ashoatKeyserverID, - t.maybe(currentUserInfoValidator), - currentUserInfo, - ); + const convertedCurrentUserInfo = currentUserInfo + ? stateSyncSpecs.currentUser.convertClientToServerInfos( + currentUserInfo, + query, + ) + : currentUserInfo; const hashResults = {}; for (const key in serverRequest.hashesToCheck) { diff --git a/lib/shared/state-sync/current-user-state-sync-spec.js b/lib/shared/state-sync/current-user-state-sync-spec.js --- a/lib/shared/state-sync/current-user-state-sync-spec.js +++ b/lib/shared/state-sync/current-user-state-sync-spec.js @@ -1,7 +1,23 @@ // @flow import type { StateSyncSpec } from './state-sync-spec.js'; +import { + type CurrentUserInfo, + type OldCurrentUserInfo, + currentUserInfoValidator, +} from '../../types/user-types.js'; +import { convertClientIDsToServerIDs } from '../../utils/conversion-utils.js'; +import { ashoatKeyserverID } from '../../utils/validation-utils.js'; -export const currentUserStateSyncSpec: StateSyncSpec<> = Object.freeze({ +export const currentUserStateSyncSpec: StateSyncSpec< + OldCurrentUserInfo | CurrentUserInfo, +> = Object.freeze({ hashKey: 'currentUserInfo', + convertClientToServerInfos(info: OldCurrentUserInfo | CurrentUserInfo) { + return convertClientIDsToServerIDs( + ashoatKeyserverID, + currentUserInfoValidator, + info, + ); + }, }); diff --git a/lib/shared/state-sync/entries-state-sync-spec.js b/lib/shared/state-sync/entries-state-sync-spec.js --- a/lib/shared/state-sync/entries-state-sync-spec.js +++ b/lib/shared/state-sync/entries-state-sync-spec.js @@ -1,12 +1,43 @@ // @flow +import t from 'tcomb'; + import type { StateSyncSpec } from './state-sync-spec.js'; +import { + type CalendarQuery, + type RawEntryInfos, + rawEntryInfoValidator, +} from '../../types/entry-types.js'; +import { convertClientIDsToServerIDs } from '../../utils/conversion-utils.js'; +import { values } from '../../utils/objects.js'; +import { ashoatKeyserverID, tID } from '../../utils/validation-utils.js'; +import { + filterRawEntryInfosByCalendarQuery, + serverEntryInfosObject, +} from '../entry-utils.js'; + +export const entriesStateSyncSpec: StateSyncSpec = Object.freeze( + { + hashKey: 'entryInfos', + innerHashSpec: { + hashKey: 'entryInfo', + deleteKey: 'deleteEntryIDs', + rawInfosKey: 'rawEntryInfos', + }, + convertClientToServerInfos( + infos: RawEntryInfos, + calendarQuery: CalendarQuery, + ) { + const filteredEntryInfos = filterRawEntryInfosByCalendarQuery( + serverEntryInfosObject(values(infos)), + calendarQuery, + ); -export const entriesStateSyncSpec: StateSyncSpec<> = Object.freeze({ - hashKey: 'entryInfos', - innerHashSpec: { - hashKey: 'entryInfo', - deleteKey: 'deleteEntryIDs', - rawInfosKey: 'rawEntryInfos', + return convertClientIDsToServerIDs( + ashoatKeyserverID, + t.dict(tID, rawEntryInfoValidator), + filteredEntryInfos, + ); + }, }, -}); +); diff --git a/lib/shared/state-sync/state-sync-spec.js b/lib/shared/state-sync/state-sync-spec.js --- a/lib/shared/state-sync/state-sync-spec.js +++ b/lib/shared/state-sync/state-sync-spec.js @@ -1,6 +1,8 @@ // @flow -export type StateSyncSpec = { +import type { CalendarQuery } from '../../types/entry-types.js'; + +export type StateSyncSpec = { +hashKey: string, +innerHashSpec?: { +hashKey: string, @@ -8,4 +10,8 @@ +rawInfosKey: string, +additionalDeleteCondition?: Info => boolean, }, + +convertClientToServerInfos: ( + infos: Infos, + calendarQuery: CalendarQuery, + ) => Infos, }; diff --git a/lib/shared/state-sync/threads-state-sync-spec.js b/lib/shared/state-sync/threads-state-sync-spec.js --- a/lib/shared/state-sync/threads-state-sync-spec.js +++ b/lib/shared/state-sync/threads-state-sync-spec.js @@ -1,12 +1,28 @@ // @flow +import t from 'tcomb'; + import type { StateSyncSpec } from './state-sync-spec.js'; +import { + type RawThreadInfos, + rawThreadInfoValidator, +} from '../../types/thread-types.js'; +import { convertClientIDsToServerIDs } from '../../utils/conversion-utils.js'; +import { ashoatKeyserverID, tID } from '../../utils/validation-utils.js'; -export const threadsStateSyncSpec: StateSyncSpec<> = Object.freeze({ - hashKey: 'threadInfos', - innerHashSpec: { - hashKey: 'threadInfo', - deleteKey: 'deleteThreadIDs', - rawInfosKey: 'rawThreadInfos', - }, -}); +export const threadsStateSyncSpec: StateSyncSpec = + Object.freeze({ + hashKey: 'threadInfos', + innerHashSpec: { + hashKey: 'threadInfo', + deleteKey: 'deleteThreadIDs', + rawInfosKey: 'rawThreadInfos', + }, + convertClientToServerInfos(infos: RawThreadInfos) { + return convertClientIDsToServerIDs( + ashoatKeyserverID, + t.dict(tID, rawThreadInfoValidator), + infos, + ); + }, + }); diff --git a/lib/shared/state-sync/users-state-sync-spec.js b/lib/shared/state-sync/users-state-sync-spec.js --- a/lib/shared/state-sync/users-state-sync-spec.js +++ b/lib/shared/state-sync/users-state-sync-spec.js @@ -1,16 +1,30 @@ // @flow import type { StateSyncSpec } from './state-sync-spec.js'; -import type { UserInfo } from '../../types/user-types.js'; +import { + type UserInfo, + type UserInfos, + userInfosValidator, +} from '../../types/user-types.js'; +import { convertClientIDsToServerIDs } from '../../utils/conversion-utils.js'; +import { ashoatKeyserverID } from '../../utils/validation-utils.js'; -export const usersStateSyncSpec: StateSyncSpec = Object.freeze({ - hashKey: 'userInfos', - innerHashSpec: { - hashKey: 'userInfo', - deleteKey: 'deleteUserInfoIDs', - rawInfosKey: 'userInfos', - additionalDeleteCondition(user: UserInfo) { - return !user.username; +export const usersStateSyncSpec: StateSyncSpec = + Object.freeze({ + hashKey: 'userInfos', + innerHashSpec: { + hashKey: 'userInfo', + deleteKey: 'deleteUserInfoIDs', + rawInfosKey: 'userInfos', + additionalDeleteCondition(user: UserInfo) { + return !user.username; + }, }, - }, -}); + convertClientToServerInfos(infos: UserInfos) { + return convertClientIDsToServerIDs( + ashoatKeyserverID, + userInfosValidator, + infos, + ); + }, + });