FileDownloader.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const got = require('got');
  2. const maxDownloadSize = 50*1024*1024;
  3. class FileDownloader {
  4. constructor() {
  5. }
  6. async load(url, callback) {
  7. let errMes = '';
  8. const options = {
  9. encoding: null,
  10. headers: {
  11. 'user-agent': 'Mozilla/5.0 (X11; HasCodingOs 1.0; Linux x64) AppleWebKit/637.36 (KHTML, like Gecko) Chrome/70.0.3112.101 Safari/637.36 HasBrowser/5.0'
  12. }
  13. };
  14. const response = await got(url, Object.assign({}, options, {method: 'HEAD'}));
  15. let estSize = 0;
  16. if (response.headers['content-length']) {
  17. estSize = response.headers['content-length'];
  18. }
  19. let prevProg = 0;
  20. const request = got(url, options).on('downloadProgress', progress => {
  21. if (progress.transferred > maxDownloadSize) {
  22. errMes = 'file too big';
  23. request.cancel();
  24. }
  25. let prog = 0;
  26. if (estSize)
  27. prog = Math.round(progress.transferred/estSize*100);
  28. else if (progress.transferred)
  29. prog = Math.round(progress.transferred/(progress.transferred + 200000)*100);
  30. if (prog != prevProg && callback)
  31. callback(prog);
  32. prevProg = prog;
  33. });
  34. try {
  35. return (await request).body;
  36. } catch (error) {
  37. errMes = (errMes ? errMes : error.message);
  38. throw new Error(errMes);
  39. }
  40. }
  41. }
  42. module.exports = FileDownloader;