UNPKG

tc-source-content-updater

Version:

Module that updates source content for the desktop application translationCore.

115 lines (94 loc) 3.48 kB
'use strict'; 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(); }); }