diff --git a/lib/selectors/account-selectors.js b/lib/selectors/account-selectors.js --- a/lib/selectors/account-selectors.js +++ b/lib/selectors/account-selectors.js @@ -50,7 +50,7 @@ ) => (state: AppState) => PreRequestUserState = keyserverID => createSelector( (state: AppState) => state.currentUserInfo, - cookieSelector, + cookieSelector(keyserverID), sessionIDSelector(keyserverID), ( currentUserInfo: ?CurrentUserInfo, diff --git a/lib/selectors/keyserver-selectors.js b/lib/selectors/keyserver-selectors.js --- a/lib/selectors/keyserver-selectors.js +++ b/lib/selectors/keyserver-selectors.js @@ -12,10 +12,14 @@ import type { AppState } from '../types/redux-types.js'; import type { ConnectionInfo } from '../types/socket-types.js'; import type { UserInfos } from '../types/user-types.js'; -import { ashoatKeyserverID } from '../utils/validation-utils.js'; -const cookieSelector: (state: AppState) => ?string = (state: AppState) => - state.keyserverStore.keyserverInfos[ashoatKeyserverID]?.cookie; +const baseCookieSelector: ( + keyserverID: string, +) => (state: AppState) => ?string = keyserverID => (state: AppState) => + state.keyserverStore.keyserverInfos[keyserverID]?.cookie; + +const cookieSelector: (keyserverID: string) => (state: AppState) => ?string = + _memoize(baseCookieSelector); const cookiesSelector: (state: AppState) => { +[keyserverID: string]: string, diff --git a/lib/selectors/server-calls.js b/lib/selectors/server-calls.js --- a/lib/selectors/server-calls.js +++ b/lib/selectors/server-calls.js @@ -31,7 +31,7 @@ keyserverID: string, ) => (state: AppState) => ServerCallState = keyserverID => createSelector( - cookieSelector, + cookieSelector(keyserverID), urlPrefixSelector(keyserverID), sessionIDSelector(keyserverID), (state: AppState) => state.currentUserInfo, diff --git a/lib/shared/session-utils.js b/lib/shared/session-utils.js --- a/lib/shared/session-utils.js +++ b/lib/shared/session-utils.js @@ -36,7 +36,7 @@ preRequestUserState && (preRequestUserState.currentUserInfo?.id !== currentCurrentUserInfo.id || preRequestUserState.cookiesAndSessions[ashoatKeyserverID].cookie !== - cookieSelector(currentReduxState) || + cookieSelector(ashoatKeyserverID)(currentReduxState) || preRequestUserState.cookiesAndSessions[ashoatKeyserverID].sessionID !== sessionIDSelector(ashoatKeyserverID)(currentReduxState)) ); diff --git a/native/account/logged-out-modal.react.js b/native/account/logged-out-modal.react.js --- a/native/account/logged-out-modal.react.js +++ b/native/account/logged-out-modal.react.js @@ -809,7 +809,7 @@ state => !!(state._persist && state._persist.rehydrated && navContext), ); const persistedStateLoaded = usePersistedStateLoaded(); - const cookie = useSelector(cookieSelector); + const cookie = useSelector(cookieSelector(ashoatKeyserverID)); const urlPrefix = useSelector(urlPrefixSelector(ashoatKeyserverID)); invariant(urlPrefix, "missing urlPrefix for ashoat's keyserver"); const loggedIn = useSelector(isLoggedIn); 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 @@ -47,7 +47,7 @@ const rehydrateConcluded = useSelector( state => !!(state._persist && state._persist.rehydrated), ); - const cookie = useSelector(cookieSelector); + const cookie = useSelector(cookieSelector(ashoatKeyserverID)); const urlPrefix = useSelector(urlPrefixSelector(ashoatKeyserverID)); invariant(urlPrefix, "missing urlPrefix for ashoat's keyserver"); const staffCanSee = useStaffCanSee(); diff --git a/native/navigation/navigation-handler.react.js b/native/navigation/navigation-handler.react.js --- a/native/navigation/navigation-handler.react.js +++ b/native/navigation/navigation-handler.react.js @@ -4,6 +4,7 @@ import { cookieSelector } from 'lib/selectors/keyserver-selectors.js'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; +import { ashoatKeyserverID } from 'lib/utils/validation-utils.js'; import { logInActionType, logOutActionType } from './action-types.js'; import ModalPruner from './modal-pruner.react.js'; @@ -60,7 +61,7 @@ const hasCurrentUserInfo = useSelector(isLoggedIn); - const cookie = useSelector(cookieSelector); + const cookie = useSelector(cookieSelector(ashoatKeyserverID)); const hasUserCookie = !!(cookie && cookie.startsWith('user=')); const loggedIn = hasCurrentUserInfo && hasUserCookie; diff --git a/native/selectors/socket-selectors.js b/native/selectors/socket-selectors.js --- a/native/selectors/socket-selectors.js +++ b/native/selectors/socket-selectors.js @@ -38,7 +38,7 @@ // the socket needs to be reopened. By including the cookie here, // whenever the cookie changes this function will change, // which tells the Socket component to restart the connection. - cookieSelector, + cookieSelector(keyserverID), (urlPrefix: ?string) => { if (!urlPrefix) { return null; @@ -51,11 +51,18 @@ keyserverID: string, ) => (state: AppState) => ?() => WebSocket = _memoize(baseOpenSocketSelector); +const baseSessionIdentificationSelector: ( + keyserverID: string, +) => (state: AppState) => SessionIdentification = keyserverID => + createSelector( + cookieSelector(keyserverID), + (cookie: ?string): SessionIdentification => ({ cookie }), + ); + const sessionIdentificationSelector: ( - state: AppState, -) => SessionIdentification = createSelector( - cookieSelector, - (cookie: ?string): SessionIdentification => ({ cookie }), + keyserverID: string, +) => (state: AppState) => SessionIdentification = _memoize( + baseSessionIdentificationSelector, ); function oneTimeKeyGenerator(inc: number): string { diff --git a/native/socket.react.js b/native/socket.react.js --- a/native/socket.react.js +++ b/native/socket.react.js @@ -45,7 +45,7 @@ const inputState = React.useContext(InputStateContext); const navContext = React.useContext(NavContext); - const cookie = useSelector(cookieSelector); + const cookie = useSelector(cookieSelector(ashoatKeyserverID)); const urlPrefix = useSelector(urlPrefixSelector(ashoatKeyserverID)); invariant(urlPrefix, 'missing urlPrefix for given keyserver id'); const connection = useSelector(connectionSelector(ashoatKeyserverID)); @@ -61,7 +61,9 @@ const openSocket = useSelector(openSocketSelector(ashoatKeyserverID)); invariant(openSocket, 'openSocket failed to be created'); - const sessionIdentification = useSelector(sessionIdentificationSelector); + const sessionIdentification = useSelector( + sessionIdentificationSelector(ashoatKeyserverID), + ); const preRequestUserState = useSelector( preRequestUserStateForSingleKeyserverSelector(ashoatKeyserverID), ); diff --git a/web/selectors/socket-selectors.js b/web/selectors/socket-selectors.js --- a/web/selectors/socket-selectors.js +++ b/web/selectors/socket-selectors.js @@ -51,7 +51,7 @@ keyserverID: string, ) => (state: AppState) => SessionIdentification = keyserverID => createSelector( - cookieSelector, + cookieSelector(keyserverID), sessionIDSelector(keyserverID), (cookie: ?string, sessionID: ?string): SessionIdentification => ({ cookie, diff --git a/web/socket.react.js b/web/socket.react.js --- a/web/socket.react.js +++ b/web/socket.react.js @@ -31,7 +31,7 @@ const WebSocket: React.ComponentType = React.memo(function WebSocket(props) { - const cookie = useSelector(cookieSelector); + const cookie = useSelector(cookieSelector(ashoatKeyserverID)); const urlPrefix = useSelector(urlPrefixSelector(ashoatKeyserverID)); invariant(urlPrefix, 'missing urlPrefix for given keyserver id'); const connection = useSelector(connectionSelector(ashoatKeyserverID));