From 826acbd10f9e094977a7c0544d7d649c7c3b2d4e Mon Sep 17 00:00:00 2001 From: Stefan Buck Date: Fri, 16 Apr 2021 00:18:41 +0200 Subject: [PATCH] Cache failed registry lookups to avoid hammering APIs --- src/registries/index.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/registries/index.js b/src/registries/index.js index 4df657ac..f0dbad7d 100644 --- a/src/registries/index.js +++ b/src/registries/index.js @@ -9,13 +9,19 @@ const cache = require('../utils/cache'); const log = require('../utils/log'); const { prioritiesHost } = require('../utils/url'); +const ERR_PACKAGE_NOT_FOUND = 'ERR_PACKAGE_NOT_FOUND'; + async function resolve(type, packageName) { const cacheKey = `${type}_${packageName}`; const cacheValue = await cache.get(cacheKey); if (cacheValue) { - return cacheValue; + if (cacheValue !== ERR_PACKAGE_NOT_FOUND) { + return cacheValue; + } + + return undefined; } const config = registryConfig[type]; @@ -34,7 +40,9 @@ async function resolve(type, packageName) { response = await got.get(requestUrl); } catch (err) { if (err.statusCode === 404) { - return log('Package not found', packageName, type); + log('Package not found', packageName, type); + await cache.set(cacheKey, ERR_PACKAGE_NOT_FOUND, 900); // 15 minutes + return; } return log(err); @@ -45,6 +53,7 @@ async function resolve(type, packageName) { json = JSON.parse(response.body); } catch (err) { log('Parsing response failed'); + await cache.set(cacheKey, ERR_PACKAGE_NOT_FOUND, 900); // 15 minutes return; } @@ -94,6 +103,7 @@ async function resolve(type, packageName) { if (!reachableUrl) { log('No URL for package found'); + await cache.set(cacheKey, ERR_PACKAGE_NOT_FOUND, 900); // 15 minutes return; }