1 | import { canPrefetch, createPrefetchClient, createClient, getCache, getInternal, processCache, modifyCache } from '@middy/util';
|
2 | import { ServiceDiscoveryClient, DiscoverInstancesCommand } from '@aws-sdk/client-servicediscovery';
|
3 | const defaults = {
|
4 | AwsClient: ServiceDiscoveryClient,
|
5 | awsClientOptions: {},
|
6 | awsClientAssumeRole: undefined,
|
7 | awsClientCapture: undefined,
|
8 | fetchData: {},
|
9 | disablePrefetch: false,
|
10 | cacheKey: 'cloud-map',
|
11 | cacheKeyExpiry: {},
|
12 | cacheExpiry: -1,
|
13 | setToContext: false
|
14 | };
|
15 | const serviceDiscoveryMiddleware = (opts = {})=>{
|
16 | const options = {
|
17 | ...defaults,
|
18 | ...opts
|
19 | };
|
20 | const fetch = (request, cachedValues = {})=>{
|
21 | const values = {};
|
22 | for (const internalKey of Object.keys(options.fetchData)){
|
23 | if (cachedValues[internalKey]) continue;
|
24 | values[internalKey] = client.send(new DiscoverInstancesCommand(options.fetchData[internalKey])).then((resp)=>resp.Instances).catch((e)=>{
|
25 | const value = getCache(options.cacheKey).value ?? {};
|
26 | value[internalKey] = undefined;
|
27 | modifyCache(options.cacheKey, value);
|
28 | throw e;
|
29 | });
|
30 | }
|
31 | return values;
|
32 | };
|
33 | let client;
|
34 | if (canPrefetch(options)) {
|
35 | client = createPrefetchClient(options);
|
36 | processCache(options, fetch);
|
37 | }
|
38 | const serviceDiscoveryMiddlewareBefore = async (request)=>{
|
39 | if (!client) {
|
40 | client = await createClient(options, request);
|
41 | }
|
42 | const { value } = processCache(options, fetch, request);
|
43 | Object.assign(request.internal, value);
|
44 | if (options.setToContext) {
|
45 | const data = await getInternal(Object.keys(options.fetchData), request);
|
46 | if (options.setToContext) Object.assign(request.context, data);
|
47 | }
|
48 | };
|
49 | return {
|
50 | before: serviceDiscoveryMiddlewareBefore
|
51 | };
|
52 | };
|
53 | export default serviceDiscoveryMiddleware;
|
54 |
|