You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.1 KiB
JavaScript
42 lines
1.1 KiB
JavaScript
'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);
|
|
});
|
|
}
|
|
} |