diff --git a/src/helpers.js b/src/helpers.js index d904fb3..e55cd51 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -182,32 +182,43 @@ module.exports.downloadFile = (url, destination, progressCallback, completeCallb .get(url, { responseType: 'stream', }) - .then((response) => { - const stream = fs.createWriteStream(destination); + .then(response => { const total = parseInt(response.headers['content-length'], 10); - let downloaded = 0; - response.data.on('data', (chunk) => { - stream.write(Buffer.from(chunk)); - downloaded += chunk.length; - if (progressCallback) { - progressCallback((downloaded / total * 100.0).toFixed(2)); - } - }); + if (total === 0) { + throw Error('No data available for download'); + } else { + const stream = fs.createWriteStream(destination); - response.data.on('end', () => { - stream.end(() => { - completeCallback(); + let downloaded = 0; + response.data.on('data', (chunk) => { + stream.write(Buffer.from(chunk)); + downloaded += chunk.length; + if (progressCallback) { + progressCallback((downloaded / total * 100.0).toFixed(2)); + } }); - }); - response.data.on('error', (e) => { - stream.end(() => { - completeCallback(e); + response.data.on('end', () => { + stream.end(() => { + if (downloaded === 0) { + throw Error('Received 0 bytes'); + } else if (downloaded !== total) { + throw Error('Received incorrect number of bytes'); + } else { + completeCallback(); + } + }); }); - }); + + response.data.on('error', error => { + stream.end(() => { + completeCallback(error); + }); + }); + } }) - .catch((e)=> { - completeCallback(e); + .catch(error => { + completeCallback(error); }); };