diff --git a/keyserver/src/socket/session-utils.js b/keyserver/src/socket/session-utils.js --- a/keyserver/src/socket/session-utils.js +++ b/keyserver/src/socket/session-utils.js @@ -435,39 +435,26 @@ } const fetchedData = await promiseAll(fetchPromises); + const specPerHashKey = Object.fromEntries( + values(serverStateSyncSpecs).map(spec => [spec.hashKey, spec]), + ); const hashesToCheck = {}, failUnmentioned = {}, stateChanges = {}; for (const key of invalidKeys) { - if (key === 'threadInfos') { - // Instead of returning all threadInfos, we want to narrow down and figure - // out which threadInfos don't match first - const threadInfos = fetchedData[serverStateSyncSpecs.threads.hashKey]; - for (const threadID in threadInfos) { - hashesToCheck[`threadInfo|${threadID}`] = hash(threadInfos[threadID]); - } - failUnmentioned.threadInfos = true; - } else if (key === 'entryInfos') { - // Instead of returning all entryInfos, we want to narrow down and figure - // out which entryInfos don't match first - const entryInfos = fetchedData[serverStateSyncSpecs.entries.hashKey]; - for (const entryID in entryInfos) { - const entryInfo = entryInfos[entryID]; - invariant(entryInfo, 'should be set'); - hashesToCheck[`entryInfo|${entryID}`] = hash(entryInfo); - } - failUnmentioned.entryInfos = true; - } else if (key === 'userInfos') { - // Instead of returning all userInfos, we want to narrow down and figure - // out which userInfos don't match first - const userInfos = fetchedData[serverStateSyncSpecs.users.hashKey]; - for (const userID in userInfos) { - hashesToCheck[`userInfo|${userID}`] = hash(userInfos[userID]); + const spec = specPerHashKey[key]; + const innerHashKey = spec?.innerHashKey; + const isTopLevelKey = !!spec; + if (isTopLevelKey && innerHashKey) { + // Instead of returning all the infos, we want to narrow down and figure + // out which infos don't match first + const infos = fetchedData[key]; + for (const infoID in infos) { + hashesToCheck[`${innerHashKey}|${infoID}`] = hash(infos[infoID]); } - failUnmentioned.userInfos = true; - } else if (key === 'currentUserInfo') { - stateChanges.currentUserInfo = - fetchedData[serverStateSyncSpecs.currentUser.hashKey]; + failUnmentioned[key] = true; + } else if (isTopLevelKey) { + stateChanges[key] = fetchedData[key]; } else if (key.startsWith('threadInfo|')) { const [, threadID] = key.split('|'); const threadInfos = fetchedData[serverStateSyncSpecs.threads.hashKey];