-
Notifications
You must be signed in to change notification settings - Fork 28
/
keyserver-call.js
120 lines (106 loc) · 3.72 KB
/
keyserver-call.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// @flow
import _memoize from 'lodash/memoize.js';
import * as React from 'react';
import type { CallSingleKeyserverEndpointOptions } from './call-single-keyserver-endpoint.js';
import { promiseAll } from './promises.js';
import { useSelector, useDispatch } from './redux-utils.js';
import { useCallKeyserverEndpointContext } from '../keyserver-conn/call-keyserver-endpoint-provider.react.js';
import {
useKeyserverCallInfos,
type KeyserverInfoPartial,
} from '../keyserver-conn/keyserver-call-infos.js';
import type { ActionFunc } from '../keyserver-conn/keyserver-conn-types.js';
import type { Endpoint } from '../types/endpoints.js';
import type { Dispatch } from '../types/redux-types.js';
import type { CurrentUserInfo } from '../types/user-types.js';
export type KeyserverCallParamOverride = Partial<{
+dispatch: Dispatch,
+currentUserInfo: ?CurrentUserInfo,
+keyserverInfos: { +[keyserverID: string]: KeyserverInfoPartial },
}>;
function useKeyserverCall<Args: mixed, Return>(
keyserverCall: ActionFunc<Args, Return>,
paramOverride?: ?KeyserverCallParamOverride,
): Args => Promise<Return> {
const baseDispatch = useDispatch();
const baseCurrentUserInfo = useSelector(state => state.currentUserInfo);
const keyserverInfos = useSelector(
state => state.keyserverStore.keyserverInfos,
);
const baseCombinedInfo = {
dispatch: baseDispatch,
currentUserInfo: baseCurrentUserInfo,
keyserverInfos,
...paramOverride,
};
const {
dispatch,
currentUserInfo,
keyserverInfos: keyserverInfoPartials,
} = baseCombinedInfo;
const keyserverCallInfos = useKeyserverCallInfos(keyserverInfoPartials);
const {
createCallSingleKeyserverEndpointSelector,
getBoundKeyserverActionFunc,
} = useCallKeyserverEndpointContext();
const getCallSingleKeyserverEndpointSelector: typeof createCallSingleKeyserverEndpointSelector =
React.useMemo(
() => _memoize(createCallSingleKeyserverEndpointSelector),
[createCallSingleKeyserverEndpointSelector],
);
const cachedNonOverridenBoundKeyserverCall = React.useMemo(
() => getBoundKeyserverActionFunc(keyserverCall),
[getBoundKeyserverActionFunc, keyserverCall],
);
return React.useMemo(() => {
if (!paramOverride) {
return cachedNonOverridenBoundKeyserverCall;
}
const callKeyserverEndpoint = (
endpoint: Endpoint,
requests: { +[keyserverID: string]: ?{ +[string]: mixed } },
options?: ?CallSingleKeyserverEndpointOptions,
) => {
const makeCallToSingleKeyserver = (keyserverID: string) => {
const {
cookie,
urlPrefix,
sessionID,
isSocketConnected,
lastCommunicatedPlatformDetails,
} = keyserverCallInfos[keyserverID];
const boundCallSingleKeyserverEndpoint =
getCallSingleKeyserverEndpointSelector(keyserverID)({
dispatch,
currentUserInfo,
cookie,
urlPrefix,
sessionID,
isSocketConnected,
lastCommunicatedPlatformDetails,
});
return boundCallSingleKeyserverEndpoint(
endpoint,
requests[keyserverID],
options,
);
};
const promises: { [string]: Promise<Object> } = {};
for (const keyserverID in requests) {
promises[keyserverID] = makeCallToSingleKeyserver(keyserverID);
}
return promiseAll(promises);
};
const keyserverIDs = Object.keys(keyserverCallInfos);
return keyserverCall(callKeyserverEndpoint, keyserverIDs);
}, [
paramOverride,
cachedNonOverridenBoundKeyserverCall,
dispatch,
currentUserInfo,
keyserverCallInfos,
getCallSingleKeyserverEndpointSelector,
keyserverCall,
]);
}
export { useKeyserverCall };