FileDownloader.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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 = 0;
  10. if (response.headers['content-length']) {
  11. estSize = response.headers['content-length'];
  12. }
  13. let prevProg = 0;
  14. const request = got(url, {encoding: null}).on('downloadProgress', progress => {
  15. if (progress.transferred > maxDownloadSize) {
  16. errMes = 'file too big';
  17. request.cancel();
  18. }
  19. let prog = 0;
  20. if (estSize)
  21. prog = Math.round(progress.transferred/estSize*100);
  22. else if (progress.transferred)
  23. prog = Math.round(progress.transferred/(progress.transferred + 100000)*100);
  24. if (prog != prevProg && callback)
  25. callback(prog);
  26. prevProg = prog;
  27. });
  28. try {
  29. return (await request).body;
  30. } catch (error) {
  31. errMes = (errMes ? errMes : error.message);
  32. throw new Error(errMes);
  33. }
  34. }
  35. }
  36. module.exports = FileDownloader;