serverless-spy
Version:
CDK-based library for writing elegant integration tests on AWS serverless architecture and an additional web console to monitor events in real time.
58 lines (57 loc) • 2.29 kB
JavaScript
const requestQueue = {};
export const updateDiscoveredEndpointInCache = async (config, options) => new Promise((resolve, reject) => {
const { endpointCache } = config;
const { cacheKey, commandName, identifiers } = options;
const endpoints = endpointCache.get(cacheKey);
if (endpoints && endpoints.length === 1 && endpoints[0].Address === "") {
if (options.isDiscoveredEndpointRequired) {
if (!requestQueue[cacheKey])
requestQueue[cacheKey] = [];
requestQueue[cacheKey].push({ resolve, reject });
}
else {
resolve();
}
}
else if (endpoints && endpoints.length > 0) {
resolve();
}
else {
const placeholderEndpoints = [{ Address: "", CachePeriodInMinutes: 1 }];
endpointCache.set(cacheKey, placeholderEndpoints);
const command = new options.endpointDiscoveryCommandCtor({
Operation: commandName.slice(0, -7),
Identifiers: identifiers,
});
const handler = command.resolveMiddleware(options.clientStack, config, options.options);
handler(command)
.then((result) => {
endpointCache.set(cacheKey, result.output.Endpoints);
if (requestQueue[cacheKey]) {
requestQueue[cacheKey].forEach(({ resolve }) => {
resolve();
});
delete requestQueue[cacheKey];
}
resolve();
})
.catch((error) => {
endpointCache.delete(cacheKey);
const errorToThrow = Object.assign(new Error(`The operation to discover endpoint failed.` +
` Please retry, or provide a custom endpoint and disable endpoint discovery to proceed.`), { reason: error });
if (requestQueue[cacheKey]) {
requestQueue[cacheKey].forEach(({ reject }) => {
reject(errorToThrow);
});
delete requestQueue[cacheKey];
}
if (options.isDiscoveredEndpointRequired) {
reject(errorToThrow);
}
else {
endpointCache.set(cacheKey, placeholderEndpoints);
resolve();
}
});
}
});