'use strict'; const Promise = require("bluebird"); const bhttp = require("bhttp"); module.exports = function(cache) { function getFromRemote(packageName) { return Promise.try(() => { let encodedPackageName = encodeURIComponent(packageName).replace(/%40/g, "@"); return bhttp.get(`https://registry.npmjs.org/${encodedPackageName}`); }).then((response) => { if (response.statusCode !== 200) { // FIXME: Proper error types throw new Error(`Got non-200 status code from NPM registry: ${response.statusCode}`); } else { return response.body; } }).tap((metadata) => { cache.set(packageName, metadata); }); } function getFromCache(packageName) { return Promise.try(() => { return cache.get(packageName); }).then((metadata) => { if (metadata._cacheExpiry < Date.now()) { throw new cache.CacheError("Cached data expired"); } else { return metadata; } }); } return function(packageName) { return Promise.try(() => { return getFromCache(packageName); }).catch(cache.CacheError, (err) => { return getFromRemote(packageName); }); } }