coc.nvim
Version:
LSP based intellisense engine for neovim & vim8.
65 lines • 2.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const follow_redirects_1 = require("follow-redirects");
const fs_1 = tslib_1.__importDefault(require("fs"));
const mkdirp_1 = tslib_1.__importDefault(require("mkdirp"));
const path_1 = tslib_1.__importDefault(require("path"));
const tar_1 = tslib_1.__importDefault(require("tar"));
const url_1 = require("url");
const fetch_1 = require("./fetch");
/**
* Download and extract tgz from url
*
* @param {string} url
* @param {DownloadOptions} options contains dest folder and optional onProgress callback
*/
function download(url, options) {
let { dest, onProgress } = options;
if (!dest || !path_1.default.isAbsolute(dest)) {
throw new Error(`Expect absolute file path for dest option.`);
}
if (!fs_1.default.existsSync(dest))
mkdirp_1.default.sync(dest);
let endpoint = url_1.parse(url);
let mod = url.startsWith('https') ? follow_redirects_1.https : follow_redirects_1.http;
let agent = fetch_1.getAgent(endpoint.protocol);
let opts = Object.assign({
method: 'GET',
hostname: endpoint.hostname,
port: endpoint.port ? parseInt(endpoint.port, 10) : (endpoint.protocol === 'https:' ? 443 : 80),
path: endpoint.path,
protocol: url.startsWith('https') ? 'https:' : 'http:',
agent,
headers: {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64)'
}
}, options);
return new Promise((resolve, reject) => {
const req = mod.request(opts, (res) => {
if (res.statusCode != 200) {
reject(new Error(`Invalid response from ${url}: ${res.statusCode}`));
return;
}
if (onProgress) {
const len = parseInt(res.headers['content-length'], 10);
let cur = 0;
if (!isNaN(len)) {
res.on('data', chunk => {
cur += chunk.length;
onProgress(cur / len);
});
}
}
let stream = res.pipe(tar_1.default.x({ strip: 1, C: dest }));
stream.on('finish', () => {
setTimeout(resolve, 100);
});
stream.on('error', reject);
});
req.on('error', reject);
req.end();
});
}
exports.default = download;
//# sourceMappingURL=download.js.map