1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import browser from 'webextension-polyfill';
- import { getBlockConnection } from '../helper';
- function handleDownload({ data, outputs }) {
- const nextBlockId = getBlockConnection({ outputs });
- const getFilesname = () =>
- JSON.parse(sessionStorage.getItem('rename-downloaded-files')) || {};
- return new Promise((resolve) => {
- if (!this.activeTab.id) throw new Error('no-tab');
- let downloadId = null;
- const handleCreated = ({ id }) => {
- if (downloadId) return;
- const names = getFilesname();
- downloadId = id;
- names[id] = data;
- sessionStorage.setItem('rename-downloaded-files', JSON.stringify(names));
- browser.downloads.onCreated.removeListener(handleCreated);
- };
- browser.downloads.onCreated.addListener(handleCreated);
- if (!data.waitForDownload) {
- resolve({
- nextBlockId,
- data: data.filename,
- });
- return;
- }
- let isResolved = false;
- let currentFilename = data.filename;
- const timeout = setTimeout(() => {
- if (isResolved) return;
- isResolved = true;
- resolve({
- nextBlockId,
- data: currentFilename,
- });
- }, data.timeout);
- const resolvePromise = (id) => {
- if (data.saveData) {
- this.addDataToColumn(data.dataColumn, currentFilename);
- }
- if (data.assignVariable) {
- this.referenceData.variables[data.variableName] = currentFilename;
- }
- clearTimeout(timeout);
- isResolved = true;
- const filesname = getFilesname();
- delete filesname[id];
- sessionStorage.setItem(
- 'rename-downloaded-files',
- JSON.stringify(filesname)
- );
- resolve({
- nextBlockId,
- data: currentFilename,
- });
- };
- const handleChanged = ({ state, id, filename }) => {
- if (this.isDestroyed || isResolved) {
- browser.downloads.onChanged.removeListener(handleChanged);
- return;
- }
- if (downloadId !== id) return;
- if (filename) currentFilename = filename.current;
- if (state && state.current === 'complete') {
- resolvePromise(id);
- } else {
- browser.downloads.search({ id }).then(([download]) => {
- if (!download || !download.endTime) return;
- resolvePromise(id);
- });
- }
- };
- browser.downloads.onChanged.addListener(handleChanged);
- });
- }
- export default handleDownload;
|