FileDownloader.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. const got = require('got');
  2. class FileDownloader {
  3. constructor() {
  4. }
  5. async load(url, callback) {
  6. const maxDownloadSize = 10*1024*1024;
  7. let errMes = '';
  8. const response = await got(url, {method: 'HEAD'});
  9. let estSize = 100000;
  10. if (response.headers['content-length']) {
  11. estSize = response.headers['content-length'];
  12. }
  13. const request = got(url, {encoding: null}).on('downloadProgress', progress => {
  14. if (progress.transferred > maxDownloadSize) {
  15. errMes = 'file too big';
  16. request.cancel();
  17. }
  18. const prog = Math.round(progress.transferred/estSize*100);
  19. if (callback)
  20. callback((prog > 100 ? 100 : prog));
  21. if (prog > 100)
  22. estSize *= 1.5;
  23. });
  24. try {
  25. return (await request).body;
  26. } catch (error) {
  27. errMes = (errMes ? errMes : error.message);
  28. throw new Error(errMes);
  29. }
  30. }
  31. }
  32. module.exports = FileDownloader;