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
@@ -6,8 +6,11 @@
 import {
   updatesCurrentAsOfSelector,
   currentAsOfSelector,
+  urlPrefixSelector,
+  cookieSelector,
 } from './keyserver-selectors.js';
 import { currentCalendarQuery } from './nav-selectors.js';
+import { createOpenSocketFunction } from '../shared/socket-utils.js';
 import type { BoundStateSyncSpec } from '../shared/state-sync/state-sync-spec.js';
 import { stateSyncSpecs } from '../shared/state-sync/state-sync-specs.js';
 import threadWatcher from '../shared/thread-watcher.js';
@@ -26,6 +29,29 @@
 import { minimumOneTimeKeysRequired } from '../utils/crypto-utils.js';
 import { values } from '../utils/objects.js';
 
+const baseOpenSocketSelector: (
+  keyserverID: string,
+) => (state: AppState) => ?() => WebSocket = keyserverID =>
+  createSelector(
+    urlPrefixSelector(keyserverID),
+    // We don't actually use the cookie in the socket open function,
+    // but we do use it in the initial message, and when the cookie changes
+    // 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(keyserverID),
+    (urlPrefix: ?string) => {
+      if (!urlPrefix) {
+        return null;
+      }
+      return createOpenSocketFunction(urlPrefix);
+    },
+  );
+
+const openSocketSelector: (
+  keyserverID: string,
+) => (state: AppState) => ?() => WebSocket = _memoize(baseOpenSocketSelector);
+
 const queuedReports: (
   state: AppState,
 ) => $ReadOnlyArray<ClientReportCreationRequest> = createSelector(
@@ -223,4 +249,9 @@
   baseSessionStateFuncSelector,
 );
 
-export { queuedReports, getClientResponsesSelector, sessionStateFuncSelector };
+export {
+  openSocketSelector,
+  queuedReports,
+  getClientResponsesSelector,
+  sessionStateFuncSelector,
+};
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
@@ -3,15 +3,11 @@
 import _memoize from 'lodash/memoize.js';
 import { createSelector } from 'reselect';
 
-import {
-  cookieSelector,
-  urlPrefixSelector,
-} from 'lib/selectors/keyserver-selectors.js';
+import { cookieSelector } from 'lib/selectors/keyserver-selectors.js';
 import {
   getClientResponsesSelector,
   sessionStateFuncSelector,
 } from 'lib/selectors/socket-selectors.js';
-import { createOpenSocketFunction } from 'lib/shared/socket-utils.js';
 import type { SignedIdentityKeysBlob } from 'lib/types/crypto-types.js';
 import type {
   ClientServerRequest,
@@ -28,29 +24,6 @@
 import type { AppState } from '../redux/state-types.js';
 import type { NavPlusRedux } from '../types/selector-types.js';
 
-const baseOpenSocketSelector: (
-  keyserverID: string,
-) => (state: AppState) => ?() => WebSocket = keyserverID =>
-  createSelector(
-    urlPrefixSelector(keyserverID),
-    // We don't actually use the cookie in the socket open function,
-    // but we do use it in the initial message, and when the cookie changes
-    // 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(keyserverID),
-    (urlPrefix: ?string) => {
-      if (!urlPrefix) {
-        return null;
-      }
-      return createOpenSocketFunction(urlPrefix);
-    },
-  );
-
-const openSocketSelector: (
-  keyserverID: string,
-) => (state: AppState) => ?() => WebSocket = _memoize(baseOpenSocketSelector);
-
 const baseSessionIdentificationSelector: (
   keyserverID: string,
 ) => (state: AppState) => SessionIdentification = keyserverID =>
@@ -144,7 +117,6 @@
 );
 
 export {
-  openSocketSelector,
   sessionIdentificationSelector,
   nativeGetClientResponsesSelector,
   nativeSessionStateFuncSelector,
diff --git a/native/socket.react.js b/native/socket.react.js
--- a/native/socket.react.js
+++ b/native/socket.react.js
@@ -11,6 +11,7 @@
   connectionSelector,
   lastCommunicatedPlatformDetailsSelector,
 } from 'lib/selectors/keyserver-selectors.js';
+import { openSocketSelector } from 'lib/selectors/socket-selectors.js';
 import { isLoggedIn } from 'lib/selectors/user-selectors.js';
 import { accountHasPassword } from 'lib/shared/account-utils.js';
 import { useInitialNotificationsEncryptedMessage } from 'lib/shared/crypto-utils.js';
@@ -32,7 +33,6 @@
 import { useSelector } from './redux/redux-utils.js';
 import { noDataAfterPolicyAcknowledgmentSelector } from './selectors/account-selectors.js';
 import {
-  openSocketSelector,
   sessionIdentificationSelector,
   nativeGetClientResponsesSelector,
   nativeSessionStateFuncSelector,
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
@@ -5,14 +5,12 @@
 
 import {
   sessionIDSelector,
-  urlPrefixSelector,
   cookieSelector,
 } from 'lib/selectors/keyserver-selectors.js';
 import {
   getClientResponsesSelector,
   sessionStateFuncSelector,
 } from 'lib/selectors/socket-selectors.js';
-import { createOpenSocketFunction } from 'lib/shared/socket-utils.js';
 import type { SignedIdentityKeysBlob } from 'lib/types/crypto-types.js';
 import type {
   ClientServerRequest,
@@ -26,20 +24,6 @@
 
 import type { AppState } from '../redux/redux-setup.js';
 
-const baseOpenSocketSelector: (
-  keyserverID: string,
-) => (state: AppState) => ?() => WebSocket = keyserverID =>
-  createSelector(urlPrefixSelector(keyserverID), (urlPrefix: ?string) => {
-    if (!urlPrefix) {
-      return null;
-    }
-    return createOpenSocketFunction(urlPrefix);
-  });
-
-const openSocketSelector: (
-  keyserverID: string,
-) => (state: AppState) => ?() => WebSocket = _memoize(baseOpenSocketSelector);
-
 const baseSessionIdentificationSelector: (
   keyserverID: string,
 ) => (state: AppState) => SessionIdentification = keyserverID =>
@@ -120,7 +104,6 @@
 );
 
 export {
-  openSocketSelector,
   sessionIdentificationSelector,
   webGetClientResponsesSelector,
   webSessionStateFuncSelector,
diff --git a/web/socket.react.js b/web/socket.react.js
--- a/web/socket.react.js
+++ b/web/socket.react.js
@@ -11,6 +11,7 @@
   connectionSelector,
   lastCommunicatedPlatformDetailsSelector,
 } from 'lib/selectors/keyserver-selectors.js';
+import { openSocketSelector } from 'lib/selectors/socket-selectors.js';
 import { useInitialNotificationsEncryptedMessage } from 'lib/shared/crypto-utils.js';
 import Socket, { type BaseSocketProps } from 'lib/socket/socket.react.js';
 import { useDispatchActionPromise } from 'lib/utils/action-utils.js';
@@ -27,7 +28,6 @@
   webCalendarQuery,
 } from './selectors/nav-selectors.js';
 import {
-  openSocketSelector,
   sessionIdentificationSelector,
   webGetClientResponsesSelector,
   webSessionStateFuncSelector,