diff --git a/server/utils/createMutex.js b/server/utils/createMutex.js deleted file mode 100644 index 7094c8b..0000000 --- a/server/utils/createMutex.js +++ /dev/null @@ -1,34 +0,0 @@ -const invariant = require("invariant"); - -function defaultCreateKey(payload) { - return payload; -} - -function createMutex(doWork, createKey = defaultCreateKey) { - const mutex = Object.create(null); - - return (payload, callback) => { - const key = createKey(payload); - - invariant( - typeof key === "string", - "Mutex needs a string key; please provide a createKey function that returns a string" - ); - - if (mutex[key]) { - mutex[key].push(callback); - } else { - mutex[key] = [callback]; - - doWork(payload, (error, value) => { - mutex[key].forEach(callback => { - callback(error, value); - }); - - delete mutex[key]; - }); - } - }; -} - -module.exports = createMutex; diff --git a/server/utils/getNpmPackageInfo.js b/server/utils/getNpmPackageInfo.js index 6bb6b47..6827e49 100644 --- a/server/utils/getNpmPackageInfo.js +++ b/server/utils/getNpmPackageInfo.js @@ -1,54 +1,37 @@ const cache = require("./cache"); -const createMutex = require("./createMutex"); const fetchNpmPackageInfo = require("./fetchNpmPackageInfo"); const notFound = "PackageNotFound"; -const mutex = createMutex((packageName, callback) => { - const key = `packageInfo2-${packageName}`; +function getNpmPackageInfo(packageName) { + return new Promise((resolve, reject) => { + const key = `npmPackageInfo-${packageName}`; - cache.get(key, (error, value) => { - if (error) { - callback(error); - } else if (value != null) { - callback(null, value === notFound ? null : JSON.parse(value)); - } else { - fetchNpmPackageInfo(packageName).then( - value => { + cache.get(key, (error, value) => { + if (error) { + reject(error); + } else if (value != null) { + resolve(value === notFound ? null : JSON.parse(value)); + } else { + fetchNpmPackageInfo(packageName).then(value => { if (value == null) { + resolve(null); + // Cache 404s for 5 minutes. This prevents us from making // unnecessary requests to the registry for bad package names. // In the worst case, a brand new package's info will be // available within 5 minutes. - cache.setex(key, 300, notFound, () => { - callback(null, null); - }); + cache.setex(key, 300, notFound); } else { + resolve(value); + // Cache valid package info for 1 minute. In the worst case, // new versions won't be available for 1 minute. cache.setnx(key, JSON.stringify(value), (error, reply) => { if (reply === 1) cache.expire(key, 60); - callback(null, value); }); } - }, - error => { - // Do not cache errors. - cache.del(key); - callback(error); - } - ); - } - }); -}); - -function getNpmPackageInfo(packageName) { - return new Promise((resolve, reject) => { - mutex(packageName, (error, value) => { - if (error) { - reject(error); - } else { - resolve(value); + }, reject); } }); });