unpkg/modules/utils/fetchNpmPackageInfo.js

58 lines
1.5 KiB
JavaScript
Raw Normal View History

2018-12-17 17:38:05 +00:00
const url = require('url');
const https = require('https');
2018-12-17 17:38:05 +00:00
const serverConfig = require('../serverConfig');
const bufferStream = require('./bufferStream');
const agent = require('./registryAgent');
const logging = require('./logging');
function parseJSON(res) {
return bufferStream(res).then(JSON.parse);
}
function fetchNpmPackageInfo(packageName) {
return new Promise((resolve, reject) => {
const encodedPackageName =
2018-12-17 17:38:05 +00:00
packageName.charAt(0) === '@'
? `@${encodeURIComponent(packageName.substring(1))}`
: encodeURIComponent(packageName);
2018-07-31 17:13:26 +00:00
const infoURL = `${serverConfig.registryURL}/${encodedPackageName}`;
2018-12-17 17:38:05 +00:00
logging.debug('Fetching package info for %s from %s', packageName, infoURL);
const { hostname, pathname } = url.parse(infoURL);
const options = {
agent: agent,
hostname: hostname,
path: pathname,
headers: {
2018-12-17 17:38:05 +00:00
Accept: 'application/json'
}
};
https
.get(options, res => {
if (res.statusCode === 200) {
resolve(parseJSON(res));
2018-07-15 23:29:54 +00:00
} else if (res.statusCode === 404) {
resolve(null);
} else {
bufferStream(res).then(data => {
2018-12-17 17:38:05 +00:00
const content = data.toString('utf-8');
const error = new Error(
`Failed to fetch info for ${packageName}\nstatus: ${
res.statusCode
}\ndata: ${content}`
);
reject(error);
});
}
})
2018-12-17 17:38:05 +00:00
.on('error', reject);
});
}
module.exports = fetchNpmPackageInfo;