handler-handle-download.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import browser from 'webextension-polyfill';
  2. import { getBlockConnection } from '../helper';
  3. function handleDownload({ data, outputs }) {
  4. const nextBlockId = getBlockConnection({ outputs });
  5. const getFilesname = () =>
  6. JSON.parse(sessionStorage.getItem('rename-downloaded-files')) || {};
  7. return new Promise((resolve) => {
  8. if (!this.activeTab.id) throw new Error('no-tab');
  9. let downloadId = null;
  10. const handleCreated = ({ id }) => {
  11. if (downloadId) return;
  12. const names = getFilesname();
  13. downloadId = id;
  14. names[id] = data;
  15. sessionStorage.setItem('rename-downloaded-files', JSON.stringify(names));
  16. browser.downloads.onCreated.removeListener(handleCreated);
  17. };
  18. browser.downloads.onCreated.addListener(handleCreated);
  19. if (!data.waitForDownload) {
  20. resolve({
  21. nextBlockId,
  22. data: data.filename,
  23. });
  24. return;
  25. }
  26. let isResolved = false;
  27. let currentFilename = data.filename;
  28. const timeout = setTimeout(() => {
  29. if (isResolved) return;
  30. isResolved = true;
  31. resolve({
  32. nextBlockId,
  33. data: currentFilename,
  34. });
  35. }, data.timeout);
  36. const resolvePromise = (id) => {
  37. if (data.saveData) {
  38. this.addDataToColumn(data.dataColumn, currentFilename);
  39. }
  40. if (data.assignVariable) {
  41. this.referenceData.variables[data.variableName] = currentFilename;
  42. }
  43. clearTimeout(timeout);
  44. isResolved = true;
  45. const filesname = getFilesname();
  46. delete filesname[id];
  47. sessionStorage.setItem(
  48. 'rename-downloaded-files',
  49. JSON.stringify(filesname)
  50. );
  51. resolve({
  52. nextBlockId,
  53. data: currentFilename,
  54. });
  55. };
  56. const handleChanged = ({ state, id, filename }) => {
  57. if (this.isDestroyed || isResolved) {
  58. browser.downloads.onChanged.removeListener(handleChanged);
  59. return;
  60. }
  61. if (downloadId !== id) return;
  62. if (filename) currentFilename = filename.current;
  63. if (state && state.current === 'complete') {
  64. resolvePromise(id);
  65. } else {
  66. browser.downloads.search({ id }).then(([download]) => {
  67. if (!download || !download.endTime) return;
  68. resolvePromise(id);
  69. });
  70. }
  71. };
  72. browser.downloads.onChanged.addListener(handleChanged);
  73. });
  74. }
  75. export default handleDownload;