diff --git a/lib/keyserver-conn/keyserver-call-infos.js b/lib/keyserver-conn/keyserver-call-infos.js new file mode 100644 --- /dev/null +++ b/lib/keyserver-conn/keyserver-call-infos.js @@ -0,0 +1,56 @@ +// @flow + +import { createSelector } from 'reselect'; + +import { useDerivedObject } from '../hooks/objects.js'; +import type { PlatformDetails } from '../types/device-types.js'; +import type { KeyserverInfo } from '../types/keyserver-types.js'; + +export type KeyserverInfoPartial = $ReadOnly<{ + ...Partial, + +urlPrefix: $PropertyType, +}>; + +export type KeyserverCallInfo = { + +cookie: ?string, + +urlPrefix: string, + +sessionID: ?string, + +isSocketConnected: boolean, + +lastCommunicatedPlatformDetails: ?PlatformDetails, +}; + +const createKeyserverCallSelector: () => KeyserverInfoPartial => KeyserverCallInfo = + () => + createSelector( + (keyserverInfo: KeyserverInfoPartial) => keyserverInfo.cookie, + (keyserverInfo: KeyserverInfoPartial) => keyserverInfo.urlPrefix, + (keyserverInfo: KeyserverInfoPartial) => keyserverInfo.sessionID, + (keyserverInfo: KeyserverInfoPartial) => + keyserverInfo.connection?.status === 'connected', + (keyserverInfo: KeyserverInfoPartial) => + keyserverInfo.lastCommunicatedPlatformDetails, + ( + cookie: ?string, + urlPrefix: string, + sessionID: ?string, + isSocketConnected: boolean, + lastCommunicatedPlatformDetails: ?PlatformDetails, + ) => ({ + cookie, + urlPrefix, + sessionID, + isSocketConnected, + lastCommunicatedPlatformDetails, + }), + ); + +function useKeyserverCallInfos(keyserverInfos: { + +[keyserverID: string]: KeyserverInfoPartial, +}): { +[keyserverID: string]: KeyserverCallInfo } { + return useDerivedObject( + keyserverInfos, + createKeyserverCallSelector, + ); +} + +export { useKeyserverCallInfos }; diff --git a/lib/utils/keyserver-call.js b/lib/utils/keyserver-call.js --- a/lib/utils/keyserver-call.js +++ b/lib/utils/keyserver-call.js @@ -2,19 +2,17 @@ import _memoize from 'lodash/memoize.js'; import * as React from 'react'; -import { createSelector } from 'reselect'; -import type { - CallServerEndpoint, - CallServerEndpointOptions, -} from './call-server-endpoint.js'; +import type { CallServerEndpointOptions } from './call-server-endpoint.js'; import { promiseAll } from './promises.js'; import { useSelector, useDispatch } from './redux-utils.js'; -import { useDerivedObject } from '../hooks/objects.js'; import { useCallKeyserverEndpointContext } from '../keyserver-conn/call-keyserver-endpoint-provider.react.js'; -import type { PlatformDetails } from '../types/device-types.js'; +import { + useKeyserverCallInfos, + type KeyserverInfoPartial, + type KeyserverCallInfo, +} from '../keyserver-conn/keyserver-call-infos.js'; import type { Endpoint } from '../types/endpoints.js'; -import type { KeyserverInfo } from '../types/keyserver-types.js'; import type { Dispatch } from '../types/redux-types.js'; import type { CurrentUserInfo } from '../types/user-types.js'; @@ -32,53 +30,6 @@ allKeyserverIDs: $ReadOnlyArray, ) => Args => Promise; -type KeyserverInfoPartial = $ReadOnly<{ - ...Partial, - +urlPrefix: $PropertyType, -}>; - -type KeyserverCallInfo = { - +cookie: ?string, - +urlPrefix: string, - +sessionID: ?string, - +isSocketConnected: boolean, - +lastCommunicatedPlatformDetails: ?PlatformDetails, -}; - -const createKeyserverCallSelector: () => KeyserverInfoPartial => KeyserverCallInfo = - () => - createSelector( - (keyserverInfo: KeyserverInfoPartial) => keyserverInfo.cookie, - (keyserverInfo: KeyserverInfoPartial) => keyserverInfo.urlPrefix, - (keyserverInfo: KeyserverInfoPartial) => keyserverInfo.sessionID, - (keyserverInfo: KeyserverInfoPartial) => - keyserverInfo.connection?.status === 'connected', - (keyserverInfo: KeyserverInfoPartial) => - keyserverInfo.lastCommunicatedPlatformDetails, - ( - cookie: ?string, - urlPrefix: string, - sessionID: ?string, - isSocketConnected: boolean, - lastCommunicatedPlatformDetails: ?PlatformDetails, - ) => ({ - cookie, - urlPrefix, - sessionID, - isSocketConnected, - lastCommunicatedPlatformDetails, - }), - ); - -function useKeyserverCallInfos(keyserverInfos: { - +[keyserverID: string]: KeyserverInfoPartial, -}): { +[keyserverID: string]: KeyserverCallInfo } { - return useDerivedObject( - keyserverInfos, - createKeyserverCallSelector, - ); -} - type BindCallKeyserverSelector = ( keyserverCall: ActionFunc, ) => Args => Promise; @@ -89,10 +40,11 @@ ): BindCallKeyserverSelector { const { createCallSingleKeyserverEndpointSelector } = useCallKeyserverEndpointContext(); - const getCallSingleKeyserverEndpointSelector = React.useMemo( - () => _memoize(createCallSingleKeyserverEndpointSelector), - [createCallSingleKeyserverEndpointSelector], - ); + const getCallSingleKeyserverEndpointSelector: typeof createCallSingleKeyserverEndpointSelector = + React.useMemo( + () => _memoize(createCallSingleKeyserverEndpointSelector), + [createCallSingleKeyserverEndpointSelector], + ); return React.useMemo( () => _memoize( @@ -104,7 +56,7 @@ requests: { +[keyserverID: string]: ?{ +[string]: mixed } }, options?: ?CallServerEndpointOptions, ) => { - const bindCallKeyserverEndpoint = (keyserverID: string) => { + const makeCallToSingleKeyserver = (keyserverID: string) => { const { cookie, urlPrefix, @@ -131,9 +83,9 @@ ); }; - const promises: { [string]: Promise } = {}; + const promises: { [string]: Promise } = {}; for (const keyserverID in requests) { - promises[keyserverID] = bindCallKeyserverEndpoint(keyserverID); + promises[keyserverID] = makeCallToSingleKeyserver(keyserverID); } return promiseAll(promises); };