tc-source-content-updater
Version:
Module that updates source content for the desktop application translationCore.
115 lines (94 loc) • 3.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.download = download;
var _url = require('url');
var _url2 = _interopRequireDefault(_url);
var _followRedirects = require('follow-redirects');
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _rimraf = require('rimraf');
var _rimraf2 = _interopRequireDefault(_rimraf);
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const HttpAgent = require('agentkeepalive'); /* eslint-disable curly */
const HttpsAgent = require('agentkeepalive').HttpsAgent;
const httpAgent = new HttpAgent();
const httpsAgent = new HttpsAgent();
const MAX_RETRIES = 3;
/**
* @description Downloads a url to a file.
* @param {String} uri the uri to download
* @param {String} dest the file to download the uri to
* @param {Function} progressCallback receives progress updates
* @param {number} retries the amount of retries for socket timeouts
* @return {Promise.<{}|Error>} the status code or an error
*/
function download(uri, dest, progressCallback, retries = 0) {
progressCallback = progressCallback || function () {};
const parsedUrl = _url2.default.parse(uri, false, true);
const makeRequest = parsedUrl.protocol === 'https:' ? _followRedirects.https.request.bind(_followRedirects.https) : _followRedirects.http.request.bind(_followRedirects.http);
const serverPort = parsedUrl.port ? parsedUrl.port : parsedUrl.protocol === 'https:' ? 443 : 80;
const agent = parsedUrl.protocol === 'https:' ? httpsAgent : httpAgent;
const file = _fsExtra2.default.createWriteStream(dest);
const options = {
host: parsedUrl.host,
path: parsedUrl.path,
agent: agent,
port: serverPort,
method: 'GET',
timeout: 120000
};
if (process.env.NODE_ENV === 'development') {
options.rejectUnauthorized = false;
}
return new Promise((resolve, reject) => {
if (!(0, _utils.areWeOnline)()) {
reject('Internet offline');
}
const req = makeRequest(options, response => {
const size = response.headers['content-length'];
let progress = 0;
response.on('data', chunk => {
progress += chunk.length;
progressCallback(size, progress);
});
response.pipe(file);
file.on('finish', () => {
_fsExtra2.default.exists(dest, exists => {
if (exists) {
if (response.statusCode === 200) {
resolve({
uri,
dest,
status: response.statusCode
});
} else {
req.emit('error', `Download did not succeed, code ${response.statusCode}`);
_fsExtra2.default.removeSync(dest); // remove failed download attempt
}
} else {
req.emit('error', 'Downloaded file does not exist');
}
});
});
});
req.on('error', error => {
file.end();
_rimraf2.default.sync(dest);
req.end();
const onLine = (0, _utils.areWeOnline)();
if (retries < MAX_RETRIES && onLine) {
console.warn(`error on resource ${uri} retrying, error: ${error}`);
setTimeout(() => {
download(uri, dest, progressCallback, retries + 1).then(resolve).catch(reject);
}, 500);
} else {
console.error(error);
reject(error);
}
});
req.end();
});
}